試試?yán)?/h2>

#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)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容