next_permutation
可以生成下一个排列,结合 do while
循环可以生成全排列。
https://www.luogu.com.cn/problem/P1706
#include <bits/stdc++.h> using namespace std; int n, a[10]; int main() { cin >> n; for(int i = 0; i < n; i++) { a[i] = i + 1; } do { for (int i = 0; i < n; i++) { cout << " " << a[i]; } cout << endl; } while (next_permutation(a, a + n)); return 0; }
如果数组中有重复的数字会怎样?
只会生成所有不同的排列。
https://atcoder.jp/contests/abc221/tasks/abc221_c
输入一个数字,把这个数字的各位分成两部分并重排,问重排之后的最大乘积是多少
https://atcoder.jp/contests/abc150/tasks/abc150_c
输入两个排列P和Q,假设是第a个和第b个排列,输出abs(a-b)
https://atcoder.jp/contests/abc145/tasks/abc145_c
输入n个点,想访问所有点有n!个顺序,每种顺序可以算一个总距离,问这n!个距离平均值是什么
https://atcoder.jp/contests/abc215/tasks/abc215_c
输入一个字符串,问全排列第k小的字典序是什么,输入的字符串可能有重复字母
https://codeforces.com/problemset/problem/124/B
输入n个k位数字,你可以重排这n个数字各个位上的值,问这n个数字的最大值减最小值最大是多少