ACM板子 第三章 搜索与图论
1.DFS
【1.1】排列数字
#include<iostream> using namespace std; const int N=10; int n; int path[N]; bool st[N]; void dfs(int u) { if(u==n)//到了第n层则输出 { for(int i=0;i<n;i++) cout<<path[i]<<' '; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!st[i])//如果这个位置没有被用过 { path[u]=i;//把i放在当前位置 st[i]=true;//并且i已经被用过了 dfs(u+1);//递归到下一层 st[i]=false;//恢复现场 } } } int main() { cin>>n; dfs(0); }
【1.2】N皇后问题
1 #include <iostream> 2 using namespace std; 3 const int N = 20; 4 int n; 5 char g[N][N]; 6 bool col[N], dg[N], udg[N]; 7 void dfs(int u) 8 { 9 if (u == n) 10 { 11 for (int i = 0; i < n; i ++ ) puts(g[i]); 12 puts(""); 13 return; 14 } 15 for (int i = 0; i < n; i ++ ) 16 if (!col[i] && !dg[u + i] && !udg[n - u + i]) 17 { 18 g[u][i] = 'Q'; 19 col[i] = dg[u + i] = udg[n - u + i] = true; 20 dfs(u + 1); 21 col[i] = dg[u + i] = udg[n - u + i] = false; 22 g[u][i] = '.'; 23 } 24 } 25 26 int main() 27 { 28 cin >> n; 29 for (int i = 0; i < n; i ++ ) 30 for (int j = 0; j < n; j ++ ) 31 g[i][j] = '.'; 32 dfs(0); 33 return 0; 34 }