考点
题解
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; }
   |