n-クイーンの問題を解決するための再帰的アルゴリズムを記述します。n×nのチェッカーボードにn個のクイーンを配置し、各クイーンに異なる行、異なる列、および異なる左右の対角線を持たせる必要があります。
アルゴリズムのアイデア:1。i
番目のクイーンはi番目の行に配置され、col [i]はi番目(1≤i≤n)のクイーンの列番号を表します。つまり、i番目のクイーンの座標位置は(i、col [i])です。
2. k番目のクイーンについて、(k、j)(1≤j≤n)が1〜k-1のクイーンと競合するかどうかをテストします。i番目の女王の場合、位置は(i、col [i])ですが、(k、j)と競合しますか?明らかにそれらは異なります。同じ列にcol [i] == jがある場合、同じ対角線に| j-col [i] | == | ki |がある場合。
3. queen(k、n)は、k-1個のクイーンが行1〜k-1に配置され、行k内の適切な列位置jをすべて見つけ、クイーンを配置してから、queen(k + 1、n)を再帰的に実行することです。 )。
#include<stdio.h>
#include<stdlib.h>
#define N 20 //最多支持20个皇后
int col[N]; //col[i]存放第i个皇后的列号
int count=0; //统计解的个数
bool place(int k, int j) //测试(k,j)位置能否摆放皇后
{ int i=1;
while(i<k)
{ if(j==col[i] || abs(j-col[i])==abs(k-i) )
return false; //相同列或相同对角线
i++;
}
return true;
}
void queen(int k, int n) //放置1~k的皇后
{
if(k>n) //n个皇后放置完毕,输出解
{ count++;
printf(" 第%d个解:",count);
for(int i=1;i<=n;i++)
printf("(%d,%d) ", i, col[i]);
printf("\n");
}
else
for(int j=1;j<=n;j++) //在第k行上穷举每一个列号j
if(place(k,j)) //在第k行找到一个合适位置(k,j)
{ col[k]=j;
queen(k+1,n);
}
}
int main()
{ int n; //n存放皇后的个数
printf("皇后的个数n=");
scanf("%d",&n);
if(n>20)
printf("n太大不能求解\n");
else
{
printf("%d皇后问题求解如下:\n", n);
queen(1,n);
}
}