一、DFS的思想:深搜会一条路走到黑,把所有的位置都填满,如下图中的路径1:

二、应用
1. 寻找1~n这n个数的所有排列方案——重点在dfs函数:
#include <iostream>
using namespace std;
const int N = 7 + 10;
int p[N];
bool st[N];
int n;
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i ++ ) cout << p[i] << " ";
cout << endl;
return;
}
for (int i = 1; i <= n; i ++ )
{
if (!st[i])
{
p[u] = i;
st[i] = true;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
2. 八皇后问题
(1)对角线的推算,如下图:

(2)代码中的数组解释:
- p[i]代表第i行皇后放在哪一列; 比如p[0]=1代表第0行皇后放在第1列
- col[i]代表第i列有没有放皇后; 比如col[0]=false代表第0列没有放皇后
- edg[i]代表第i条对角线有没有放皇后; 比如edg[0]=false代表第0条没有放皇后
- uedg[i]代表第i条反对角线有没有放皇后; 比如uedg[0]=false代表第0条反对角线没有放皇后
(3)代码——重点在dfs函数:
#include <iostream>
using namespace std;
const int N = 9 + 10;
int p[N];
bool col[N], edg[2 * N], uedg[2 * N];
int n;
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
{
if (p[i] == j) cout << 'Q';
else cout << '.';
}
cout << endl;
}
cout << endl;
}
for (int i = 0; i < n; i ++ )
{
if (!col[i] && !edg[u + i] && !uedg[u - i + n - 1])
{
p[u] = i;
col[i] = true, edg[u + i] = true, uedg[u - i + n - 1] = true;
dfs(u + 1);
col[i] = false, edg[u + i] = false, uedg[u - i + n - 1] = false;
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}