考点
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <bits/stdc++.h>
using namespace std;
int arr[10], vis[10], N;
void print() { for (int i = 0; i < N; ++i) cout << setfill(' ') << setw(5) << arr[i]; cout << endl; }
void dfs(int idx) { if (idx == N) { print(); return; } for (int i = 1; i <= N; ++i) { if (vis[i]) continue; arr[idx] = i; vis[i] = 1; dfs(idx + 1); vis[i] = 0; } }
int main() { cin >> N; dfs(0); return 0; }
|
思路
用vis数组记录元素是否用过;每次元素的可能性都从1遍历到N(因为不同序列的元素组成可以相同)
只要没有被访问就纳入答案数组内,并在vis记录已用;当本次可能性的递归结束后,vis记录恢复为未用,避免影响其他情况
当然,全排列也可以直接调用STL函数next_permutation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <bits/stdc++.h>
using namespace std;
int arr[10], vis[10], N;
void print() { for (int i = 0; i < N; ++i) cout << setfill(' ') << setw(5) << arr[i]; cout << endl; }
int main() { cin >> N; for (int i = 1; i <= N; ++i) arr[i - 1] = i; do { print(); } while (next_permutation(arr, arr + N)); return 0; }
|