递归过程:
保留该状态,先继续向下执行,不满足返回后:(继续向下执行)的这些数还要继续向上返回去 ,dfs先判断下一个状态是否合适,通俗说是用下一个状态当探兵,因为递归出口其实都是实际不能达到的位置,所以返回递归调用的位置时,该状态都是未加/减的这些状态,用该状态继续向下执行语句。
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n;
bool row[N],col[N],dg[N],udg[N];
char g[N][N];
//x:行 y:列 s:皇后个数
/*该题递归的顺序*/
void dfs(int x,int y,int s)
{
if(s>n)return ;
if(y==n)
{
y=0;
x+=1;
}
if(x==n)
{
if(s==n)
{
for(int i=0;i<n;i++)
{
cout<<g[i]<<endl;
}
cout<<endl;
}
return ;
}
g[x][y]='.';
dfs(x,y+1,s);//该结点的两个状态:不选该结点(这两个状态可以调换顺序)
if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n])
{
row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
g[x][y] = 'Q';
dfs(x, y + 1, s + 1);//该结点第二种状态:选该结点
g[x][y] = '.';
row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
}
}
int main()
{
cin>>n;
dfs(0,0,0);
return 0;
}