题目:
代码:
第一种搜素顺序
#include <iostream>
using namespace std;
const int N = 10;
int n;
int path[N];
char g[N][N];
bool col[N],dg[N],udg[N]; //col[N]列,dg[N]正对角线,udg[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 ++ ) //从第一行开始枚举
if (!col[i] && !dg[u+i] && !udg[n-u+i]) //先前该列该对角线该反对角线没有放过皇后。对角线截距b=y+x和b=y-x,y-x可能为负数,所以加上n
{
g[u][i]='Q';
col[i]=dg[u+i]=udg[n-u+i]=true; //表明有皇后
dfs(u+1);
path[u]=0; //可省略
col[i]=dg[u+i]=udg[n-u+i]=false; //恢复
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);
return 0;
}
第二种搜索顺序
#include <iostream>
using namespace std;
const int N = 10;
int n;
int path[N];
char g[N][N];
bool row[N],col[N],dg[N],udg[N]; //row[N]行,col[N]列,dg[N]正对角线,udg[N]反对角线
void dfs(int x,int y,int s)
{
if(y==n) y=0,x++; //出界就移到下一层格子
if(x==n){ //枚举到最后一行
if(s==n){ //说明找到一组方案
for(int i=0;i<n;i++)puts(g[i]);
puts("");
}
return ;
}
//不放皇后
dfs(x,y+1,s); //递归到下一格子
//放皇后
if(!row[x] && !col[y] && !dg[x+y] && !udg[x-y+n]){ //先前该行,该列,该对角线,该反对角线没有放过皇后。
g[x][y]='Q';
row[x] = col[y] = dg[x+y] = udg[x-y+n] = true; //更新成放皇后
dfs(x,y+1,s+1); //递归到下一层
row[x] = col[y] = dg[x+y] = udg[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);
return 0;
}