#include<stdio.h>
#define Debug
int count=0;
void Queen(int n,int l);
bool CanPut(int i,int j,int (*a)[8],int n);
void Print(int (*a)[8],int n);
int main()
{
printf("请输入棋盘的规模\n");
int n;
scanf("%d",&n);
Queen(n,0);
if(count)
printf("解的总数是:%d\n",count);
else
printf("无解\n");
return 1;
}
int a[8][8]={0};
void Queen(int n,int l)
{
if(l==n-1)//最后一行,递归出口
{
for(int j=0;j<n;j++)
{
if(CanPut(l,j,a,n))//是否能放置皇后
{
count++;
a[l][j]=1;//标记位置
Print(a,n);
a[l][j]=0;//取消这个位置
}
}
printf("\n");
}
else//不是最后一行
{
for(int j=0;j<n;j++)
{
a[l][j]=1;//假设这个位置可以放
if(CanPut(l,j,a,n))//如果可以,递归进入下一行
Queen(n,l+1);
a[l][j]=0;//回溯回来后或者不可以放置皇后归0
}
}
return;//如果是if,则递归出口,如果是else,则回溯到上一行
}
void Print(int (*a)[8],int n)
{//本算法打印出N皇后的解
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
bool CanPut(int i,int j,int (*a)[8],int n)
{//本算法是判断该位置能否放皇后
int s=0;
for(int k=i-1;k>=0;k--)
{
s++;
if(a[k][j]==1 || j+s<n&&a[k][j+s]==1 || j-s>=0&&a[k][j-s]==1)
return false;
}
return true;
}
作者:weixin_41133154
来源:CSDN
原文:https://blog.csdn.net/weixin_41133154/article/details/78986617
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论