八皇后可以扩充到n皇后,注意DEGREE不要开的太大,因为解的数量增长非常快,八皇后才92,九皇后就有392组解了。
同样使用dfs。
#include <cstdio>
#include <cmath>
#define DEGREE 8//八皇后,可以改成其他阶数的
//数组使用自然下标[1,n],0号位空出
int result[DEGREE+1];//第i行的第result[i]列放一个皇后
bool book[DEGREE+1];//标记第i列是否放过皇后
int degree;//从外部读入阶数
int solution_cnt;//解计数器
bool isAvailable(int i,int step);//检查第step行放i列是否可行
void printSheet();//打印棋盘
void dfs(int step)
{
if(step==degree+1)//已经完成了n皇后,到达了第n+1步,可以打印了
{
printf("Solution #%d\n",solution_cnt++ );
for(int i=1;i<=degree;++i)
printf("%d%c",result[i],i==degree?'\n':' ' );
printSheet();
putchar('\n');
return ;
}
for(int i=1;i<=degree;++i)//尝试每一个位置
{
if(book[i]) continue;//标记用过就不用再检测了
//假设第step位选择i
if(isAvailable(i,step))//检测第step个皇后放i是否可行
{
result[step]=i;//第step行放在第i列
book[i]=1;//i标记使用
dfs(step+1);//继续搜索
book[i]=0;
}
}
}
bool isAvailable(int i,int step)
{
for(int j=1;j<step;++j)
{
if(result[j]==i)
return false;//同一列肯定是不行的
if(abs(step-j)==abs(i-result[j]))
return false;//同一对角线也不行
}
return true;
}
void printSheet()
{
bool sheet[degree+1][degree+1]={false};
for(int i=1;i<=degree;++i)
sheet[i][result[i]]=true;
for(int i=1;i<=degree;++i)
for(int j=1;j<=degree;++j)
printf("%c%c",sheet[i][j]?'*':'.',j==degree?'\n':' ');
putchar('\n');
}
int main(int argc, char const *argv[])
{
degree=DEGREE;
//scanf("%d",°ree);
dfs(1);
return 0;
}