#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;
}
八皇后问题
2024-07-16 17:38:01 28 阅读