DFS
DFS全排列:
#include <iostream> #include <cstring> using namespace std; const int N = 10; int n,path[N]; bool sta[N]; void dfs(int u) { if(u == n) { for(int i = 0;i<n;i++) cout<<path[i]<<" "; cout<<endl; return; } for(int i = 1;i<=n;i++) { if(!sta[i]) { path[u] = i; sta[i] = 1; dfs(u+1); sta[i] = 0; } } } int main() { cin>>n; dfs(0); }
n皇后问题:
#include <iostream> #include <cstring> using namespace std; const int N = 10; int n,tot; char g[N][N]; bool col[N],edg[N],uedg[N]; void dfs(int u) { if(u == n) { tot++; for(int i = 0;i<n;i++) puts(g[i]); puts(""); return; } for(int i = 0;i<n;i++) if(!col[i] && !edg[i - u + n] && !uedg[i + u]) { g[u][i] = 'Q'; col[i] = edg[i-u+n] = uedg[i+u] = 1; dfs(u+1); col[i] = edg[i-u+n] = uedg[i+u] = 0; g[u][i] = '.'; } } int main() { cin>>n; for(int i = 0;i<n;i++) for(int j = 0;j<n;j++) g[i][j] = '.'; dfs(0); }
注意:以8皇后为例
1、正对角线的行+列总是相等的,如:(2,0)(1,1)(0,2),(3,0)(2,1)(1,2)(0,3)每次循环的时候u+i总是相等的。edg[i+u]
2、斜对角线的差总是相等的,如:(0,6)(1,7),(0,5)(1,6)(2,7),(0,4)(1,5)(2,6)(3,7)每次循环u-i+n总是相等的,uedg[u-i+n]
3、在到达递归边界 u == n的时候,输出的时候要用puts(g[i]),若用cout<<g[i];则会出现错误输出。
4、在递归循环的时候,在递归完恢复状态的时候,因为之前全排列的时候数值会覆盖,而且一定会有值,但是这里要设置回点:g[u][i] = '.'
n皇后问题还有一种更为朴素DFS搜索方式,就是从左到右,从上到下依次进行搜索。
#include <iostream> #include <cstring> using namespace std; const int N = 20; int n,tot; char g[N][N]; bool row[N],col[N],edg[N],uedg[N]; void dfs(int x,int y,int s) { if(y == n) x++, y = 0; if(x == n) { if(s == n) { for(int i = 0;i<n;i++) puts(g[i]); cout<<endl; } return; } dfs(x,y+1,s); if(!row[x] && !col[y] && !edg[x+y] && !uedg[x-y+n]) { tot++; g[x][y] = 'Q'; row[x] = col[y] = edg[x+y] = uedg[x-y+n] = true; dfs(x,y+1,s+1); row[x] = col[y] = edg[x+y] = uedg[x-y+n] = false; g[x][y] = '.'; } } int main() { cin>>n; for(int i = 0;i<n;i++) for(int j = 0;j<n;j++) g[i][j] = '.'; dfs(0,0,0); // cout<<tot<<endl; }
在这里通过 行x、列y、的方式进行全部搜索,如果每一行搜完,那么x++, y = 0; 如果x = n,皇后数量s = n那么此方案可行,输出返回。
8皇后的全部解决方案:
8
.......Q
...Q....
Q.......
..Q.....
.....Q..
.Q......
......Q.
....Q...
.......Q
..Q.....
Q.......
.....Q..
.Q......
....Q...
......Q.
...Q....
.......Q
.Q......
....Q...
..Q.....
Q.......
......Q.
...Q....
.....Q..
.......Q
.Q......
...Q....
Q.......
......Q.
....Q...
..Q.....
.....Q..
......Q.
....Q...
..Q.....
Q.......
.....Q..
.......Q
.Q......
...Q....
......Q.
...Q....
.Q......
.......Q
.....Q..
Q.......
..Q.....
....Q...
......Q.
...Q....
.Q......
....Q...
.......Q
Q.......
..Q.....
.....Q..
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
...Q....
......Q.
..Q.....
Q.......
.....Q..
.......Q
....Q...
.Q......
...Q....
......Q.
.Q......
.....Q..
..Q.....
Q.......
...Q....
.......Q
....Q...
......Q.
.Q......
...Q....
Q.......
.......Q
....Q...
..Q.....
.....Q..
......Q.
Q.......
..Q.....
.......Q
.....Q..
...Q....
.Q......
....Q...
.....Q..
.......Q
.Q......
...Q....
Q.......
......Q.
....Q...
..Q.....
.....Q..
...Q....
......Q.
Q.......
.......Q
.Q......
....Q...
..Q.....
.....Q..
...Q....
......Q.
Q.......
..Q.....
....Q...
.Q......
.......Q
.....Q..
...Q....
.Q......
.......Q
....Q...
......Q.
Q.......
..Q.....
.....Q..
...Q....
Q.......
....Q...
.......Q
.Q......
......Q.
..Q.....
.....Q..
..Q.....
......Q.
...Q....
Q.......
.......Q
.Q......
....Q...
.....Q..
..Q.....
......Q.
.Q......
.......Q
....Q...
Q.......
...Q....
.....Q..
..Q.....
......Q.
.Q......
...Q....
.......Q
Q.......
....Q...
.....Q..
..Q.....
....Q...
.......Q
Q.......
...Q....
.Q......
......Q.
.....Q..
..Q.....
....Q...
......Q.
Q.......
...Q....
.Q......
.......Q
.....Q..
..Q.....
Q.......
.......Q
....Q...
.Q......
...Q....
......Q.
.....Q..
..Q.....
Q.......
.......Q
...Q....
.Q......
......Q.
....Q...
.....Q..
..Q.....
Q.......
......Q.
....Q...
.......Q
.Q......
...Q....
.....Q..
.Q......
......Q.
Q.......
...Q....
.......Q
....Q...
..Q.....
.....Q..
.Q......
......Q.
Q.......
..Q.....
....Q...
.......Q
...Q....
.....Q..
Q.......
....Q...
.Q......
.......Q
..Q.....
......Q.
...Q....
....Q...
.......Q
...Q....
Q.......
......Q.
.Q......
.....Q..
..Q.....
....Q...
.......Q
...Q....
Q.......
..Q.....
.....Q..
.Q......
......Q.
....Q...
......Q.
...Q....
Q.......
..Q.....
.......Q
.....Q..
.Q......
....Q...
......Q.
.Q......
.....Q..
..Q.....
Q.......
.......Q
...Q....
....Q...
......Q.
.Q......
.....Q..
..Q.....
Q.......
...Q....
.......Q
....Q...
......Q.
.Q......
...Q....
.......Q
Q.......
..Q.....
.....Q..
....Q...
......Q.
Q.......
...Q....
.Q......
.......Q
.....Q..
..Q.....
....Q...
......Q.
Q.......
..Q.....
.......Q
.....Q..
...Q....
.Q......
....Q...
..Q.....
.......Q
...Q....
......Q.
Q.......
.....Q..
.Q......
....Q...
..Q.....
Q.......
......Q.
.Q......
.......Q
.....Q..
...Q....
....Q...
..Q.....
Q.......
.....Q..
.......Q
.Q......
...Q....
......Q.
....Q...
.Q......
.......Q
Q.......
...Q....
......Q.
..Q.....
.....Q..
....Q...
.Q......
.....Q..
Q.......
......Q.
...Q....
.......Q
..Q.....
....Q...
.Q......
...Q....
......Q.
..Q.....
.......Q
.....Q..
Q.......
....Q...
.Q......
...Q....
.....Q..
.......Q
..Q.....
Q.......
......Q.
....Q...
Q.......
.......Q
.....Q..
..Q.....
......Q.
.Q......
...Q....
....Q...
Q.......
.......Q
...Q....
.Q......
......Q.
..Q.....
.....Q..
....Q...
Q.......
...Q....
.....Q..
.......Q
.Q......
......Q.
..Q.....
...Q....
.......Q
....Q...
..Q.....
Q.......
......Q.
.Q......
.....Q..
...Q....
.......Q
Q.......
....Q...
......Q.
.Q......
.....Q..
..Q.....
...Q....
.......Q
Q.......
..Q.....
.....Q..
.Q......
......Q.
....Q...
...Q....
......Q.
....Q...
..Q.....
Q.......
.....Q..
.......Q
.Q......
...Q....
......Q.
....Q...
.Q......
.....Q..
Q.......
..Q.....
.......Q
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
...Q....
......Q.
Q.......
.......Q
....Q...
.Q......
.....Q..
..Q.....
...Q....
.....Q..
.......Q
..Q.....
Q.......
......Q.
....Q...
.Q......
...Q....
.....Q..
.......Q
.Q......
......Q.
Q.......
..Q.....
....Q...
...Q....
.....Q..
Q.......
....Q...
.Q......
.......Q
..Q.....
......Q.
...Q....
.Q......
.......Q
.....Q..
Q.......
..Q.....
....Q...
......Q.
...Q....
.Q......
.......Q
....Q...
......Q.
Q.......
..Q.....
.....Q..
...Q....
.Q......
......Q.
....Q...
Q.......
.......Q
.....Q..
..Q.....
...Q....
.Q......
......Q.
..Q.....
.....Q..
.......Q
....Q...
Q.......
...Q....
.Q......
......Q.
..Q.....
.....Q..
.......Q
Q.......
....Q...
...Q....
.Q......
....Q...
.......Q
.....Q..
Q.......
..Q.....
......Q.
...Q....
Q.......
....Q...
.......Q
.....Q..
..Q.....
......Q.
.Q......
...Q....
Q.......
....Q...
.......Q
.Q......
......Q.
..Q.....
.....Q..
..Q.....
.......Q
...Q....
......Q.
Q.......
.....Q..
.Q......
....Q...
..Q.....
......Q.
.Q......
.......Q
.....Q..
...Q....
Q.......
....Q...
..Q.....
......Q.
.Q......
.......Q
....Q...
Q.......
...Q....
.....Q..
..Q.....
.....Q..
.......Q
.Q......
...Q....
Q.......
......Q.
....Q...
..Q.....
.....Q..
.......Q
Q.......
....Q...
......Q.
.Q......
...Q....
..Q.....
.....Q..
.......Q
Q.......
...Q....
......Q.
....Q...
.Q......
..Q.....
.....Q..
...Q....
.Q......
.......Q
....Q...
......Q.
Q.......
..Q.....
.....Q..
...Q....
Q.......
.......Q
....Q...
......Q.
.Q......
..Q.....
.....Q..
.Q......
......Q.
....Q...
Q.......
.......Q
...Q....
..Q.....
.....Q..
.Q......
......Q.
Q.......
...Q....
.......Q
....Q...
..Q.....
.....Q..
.Q......
....Q...
.......Q
Q.......
......Q.
...Q....
..Q.....
....Q...
.......Q
...Q....
Q.......
......Q.
.Q......
.....Q..
..Q.....
....Q...
......Q.
Q.......
...Q....
.Q......
.......Q
.....Q..
..Q.....
....Q...
.Q......
.......Q
.....Q..
...Q....
......Q.
Q.......
..Q.....
....Q...
.Q......
.......Q
Q.......
......Q.
...Q....
.....Q..
..Q.....
Q.......
......Q.
....Q...
.......Q
.Q......
...Q....
.....Q..
.Q......
.......Q
.....Q..
Q.......
..Q.....
....Q...
......Q.
...Q....
.Q......
......Q.
....Q...
.......Q
Q.......
...Q....
.....Q..
..Q.....
.Q......
......Q.
..Q.....
.....Q..
.......Q
....Q...
Q.......
...Q....
.Q......
.....Q..
.......Q
..Q.....
Q.......
...Q....
......Q.
....Q...
.Q......
.....Q..
Q.......
......Q.
...Q....
.......Q
..Q.....
....Q...
.Q......
....Q...
......Q.
...Q....
Q.......
.......Q
.....Q..
..Q.....
.Q......
....Q...
......Q.
Q.......
..Q.....
.......Q
.....Q..
...Q....
.Q......
...Q....
.....Q..
.......Q
..Q.....
Q.......
......Q.
....Q...
Q.......
......Q.
....Q...
.......Q
.Q......
...Q....
.....Q..
..Q.....
Q.......
......Q.
...Q....
.....Q..
.......Q
.Q......
....Q...
..Q.....
Q.......
.....Q..
.......Q
..Q.....
......Q.
...Q....
.Q......
....Q...
Q.......
....Q...
.......Q
.....Q..
..Q.....
......Q.
.Q......
...Q....
118969
Program ended with exit code: 0