#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("請輸入棋盤的規(guī)模\n");
int n;
scanf("%d",&n);
Queen(n,0);
if(count)
printf("解的總數(shù)是:%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;//標(biāo)記位置
Print(a,n);
a[l][j]=0;//取消這個位置
}
}
printf("\n");
}
else//不是最后一行
{
for(int j=0;j<n;j++)
{
a[l][j]=1;//假設(shè)這個位置可以放
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
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!