#include<bits/stdc++.h>
using namespace std;
int a[9],b[9];
bool c[17],d[17];//对角线/行数列数之和相等范围2~16
//行数列数之差相等,范围-7~7
//因为-7无法计算所以这里我们使用集体+7的方法来解决
int total;
void print()//输出函数
{
total++;//方案数从1开始
cout<<total<<endl;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
if(a[i]==j)
cout<<setw(2)<<"1";//棋子所在位置
else
cout<<setw(2)<<"0";//空白
}
cout<<endl;
}
}
void dfs(int k){
for(int i=1;i<=8;i++){
if((!b[i])&&(!c[k+i])&&(!d[k-i+7])){//判断对角线
a[k]=i;
b[i]=1;
c[k+i]=1;
d[k-i+7]=1;//设为不能放的位置
if(k==8) print();//8个皇后位置都有
else dfs(k+1);//再来一遍
b[i]=0;
c[k+i]=0;
d[k-i+7]=0;//回溯
}
}
}
int main()
{
dfs(1);//从1开始
cout<<total;//total是全局变量,是会有函数内部的计算结果
return 0;
}
八皇后问题详解
最新推荐文章于 2023-05-29 12:37:31 发布