#include<bits/stdc++.h>
using namespace std;
int mp[100][100],cnt=1;//警钟敲烂 数组请开大于15 15
bool cheak(int x,int y){//判断xy位置是否合法
//同一列有没有 对角线有没有 --> y? x+y? x-y?
for(int i=1;i<x;i++)
if(mp[i][y]==1||mp[i][x+y-i]==1||mp[i][i-x+y]==1) return false;
for(int i=1;i<x;i++)//i+j = x+y j=x+y-i mp[i][x+y-i]==1?
if(mp[i][x+y-i]==1) return false;
for(int i=1;i<x;i++) // i-j = x-y j=i-x+y mp[i][i-x+y]==1?
if(mp[i][i-x+y]==1) return false;
return true;
}
void dfs(int x){//在第x行放皇后
//出口
if(x==9){//8个皇后放好了
cout<<"No. "<<cnt<<endl;
cnt++;
for(int i=1;i<=8;i++,puts(""))
for(int j=1;j<=8;j++)
cout<<mp[j][i]<<" "; //警钟敲烂2: 输出ij是转置过的
return;
}
for(int j=1;j<=8;j++) //第x行的皇后可以放在 第1~8列
{
//同一列有没有 对角线有没有 --> y? x+y? x-y?
if(cheak(x,j))//判断x,j这个位置能不能放皇后
{
mp[x][j]=1;//保持现场--》在x j 的位置放皇后
dfs(x+1);//第x行已经放好皇后,所以接着取放第x+1行
mp[x][j]=0;//回溯:还原现场--》回收皇后
}
}
}
int main()
{
dfs(1);
return 0;
}
07-05
03-10
2335
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-26
515
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-24
11-10
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交