题目:
代码讲解:
#include <iostream>
using namespace std;
const int N = 20;
char g[N][N]; //需要一个二维数组来表示棋盘
bool col[N], dg[N], udg[N]; //n*n棋盘的对角线数量时2n-1
int n;
void dfs(int u) //传如的参数表述棋盘的行数
{
//递归出口:当搜索的行数等于输入的行数时,输出棋盘,结束递归
if(u == n)
{
for(int i = 0; i < n; i++) puts(g[i]);
puts("");
return ;
}
//开始深搜:
for(int i = 0; i < n; i++) //i 表示列数
{
//深搜的条件
//(u, i) => (y, x);
//正对角线:y = x + b, 反对角线:y = -x + b;
//在对角线上,y+x / y-x 都等于一个常数,就是这条对角线上的截距,也就是说只要在同一条对角线上,那么他们的截距一定相等
//而两条对角线上的截距分别可以表示成b = u + i / u - i;
//为了保证截距为正数,可以将这条对角线往上平移,即加上一个n
if(col[i] == false && dg[u + i] == false && udg[n + u - i] == false)
{
g[u][i] = 'Q';
col[i] = dg[u + i] = udg[n + u - i] = true;
//结束本行,搜索下一行
dfs(u + 1);
//恢复判断条件:
col[i] = dg[u + i] = udg[n + u - i] = false;
g[u][i] = '.';
}
}
}
int main()
{
scanf("%d", &n);
//初始化棋盘:
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++) g[i][j] = '.';
}
dfs(0);
return 0;
}
关于深搜递归过程的理解:
那直接使用上面的代码模板来解决力扣上的n皇后问题吧
非常简单:
class Solution {
public:
vector<string> path;
vector<bool> col, dg, udg;
vector<vector<string>> ans;
void dfs(int u, int n)
{
if(u == n)
{
ans.push_back(path);
return ;
}
for(int i = 0; i < n; i++)
{
if(col[i] == false && dg[i + u] == false && udg[u - i + n] == false)
{
path[u][i] = 'Q';
col[i] = dg[i + u] = udg[u - i + n] = true;
dfs(u + 1, n);
col[i] = dg[i + u] = udg[u - i + n] = false;
path[u][i] = '.';
}
}
}
vector<vector<string>> solveNQueens(int n)
{
path = vector<string>(n, string(n, '.'));
col = vector<bool>(n);
dg = udg = vector<bool>(n * 2);
dfs(0, n);
return ans;
}
};