问题描述
n皇后问题
格式输入
n
格式输出
排列顺序
样例输入
4
样例输出
.Q…
…Q
Q…
…Q.
…Q.
Q…
…Q
.Q…
评测用例规模与约定
n<=10
解析
使用dfs算法进行解决,可以画一个递归搜索树来实现
解法一:枚举每一个
解法二:一行放一个
由y=x+b和y=-x+b实现
参考程序
#include<iostream>
using namespace std;
const int N=20;
char path[N][N];
bool row[N],col[N],udg[N],dg[N];
int n;
void dfs(int x,int y,int s)
{
if(y==n){y=0;x++;}
if(x==n)
{
if(s==n){
REP(i,n)cout<<path[i]<<endl;
}
return;
}
if(!row[x]&&!col[y]&&!udg[x-y+n]&&!dg[x+y])
{
path[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;
path[x][y] = '.';
}
dfs(x,y+1,s);
}
int main() {
int t;
cin >> t;
while (t--) {
cin>>n;
REP(i,n)
REP(j,n)
path[i][j]='.';
dfs(0,0,0);
}
return 0;
}
#include<iostream>
using namespace std;
const int N = 20;
int n;
char g[N][N];
bool 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])
{
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()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = '.';//初始化
dfs(0);
return 0;
}
以个人刷题整理为目的,如若侵权,请联系删除~