#include<iostream>
#include<algorithm>
using namespace std;
int n;
char ans[15][15];
bool judge(int p,int q){//用于判断同行同列同一斜线上是否有其他皇后;
// cout<<"p="<<p<<"q="<<q<<"a[1][1]"<<ans[1][1]<<endl;
for(int i=p,j=q;i<=n&&j<=n;i++,j++){
if(ans[i][j]=='Q')return false;
}
for(int i=p,j=q;i>=1&&j>=1;i--,j--){
if(ans[i][j]=='Q')return false;
}
for(int i=p,j=q;i<=n&&j>=1;i++,j--){
if(ans[i][j]=='Q')return false;
}
for(int i=p,j=q;i>=1&&j<=n;i--,j++){
if(ans[i][j]=='Q')return false;
}
for(int i=1;i<=n;i++){
if(ans[i][q]=='Q'||ans[p][i]=='Q')return false;
}
return true;
}
void dfs(int p,int q){//搜索递归的去找
ans[p][q]='Q';//既然进入了dfs函数中就意味着一定可以放的;
if(p==n){//输出
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<ans[i][j];
}
cout<<endl;
}
return;
}
for(int i=1;i<=n;i++){
if(p+1>n)break;
if(judge(p+1,i)==true){//判断该点是否可以放皇后
dfs(p+1,i);ans[p+1][i]='.';
}
}
ans[p][q]='.';
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){//初始化
for(int j=1;j<=n;j++){
ans[i][j]='.';
}
}
for(int i=1;i<=n;i++)
dfs(1,i);//搜索
}
经典搜索N皇后问题
最新推荐文章于 2024-07-12 18:56:03 发布