1.排列数字 DFS

 

 

 DFS需要考虑搜索顺序

这道题的搜索顺序是:

假定一开始有n个空位了

然后从左往右,从第一位开始填

每一次填的时候,要填的数字不能和前面一样

 回溯时要记得恢复现场

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 10;
 4 int ans[N]; //答案
 5 bool vis[N]; //vis[i]等于true时,表示i这个数被用过了
 6 int n;
 7 void dfs(int u) {
 8     if (u == n) { //所有位置都搜完了
 9         for (int i = 0; i < n; i++) { //输出
10             cout << ans[i] << " ";
11         }
12         cout << endl;
13         return;
14     }
15     for (int i = 0; i < n; i++) { //枚举当前位置可以填哪个数
16         if (!vis[i]) { //如果这个数没有被用到
17             ans[u] = i + 1; //把这个数放在当前这个位置上
18             vis[i] = true; //标记这个数已经被用过了
19             dfs(u + 1); //递归到下一层
20             //然后当上面这个dfs结束的时候,就意味着已经把上面这条路全部走完了
21             //下面两行是回溯和恢复现场,恢复成原样
22             ans[u] = 0;
23             vis[i] = false;
24         }
25     }
26 }
27 int main() {
28     cin >> n;
29     dfs(0); //从第0个位置开始看
30     return 0;
31 }
原文地址:https://www.cnblogs.com/fx1998/p/13306488.html