/*八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
该问题是十九世纪著名的数学家高斯1850年提出:
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,
即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
*/
#include<stdio.h>
#define MAXN 20
int u[MAXN],l[2*MAXN],r[2*MAXN],/*这三个数组判断行,正向对角线,逆向对角线是否已有皇后*/
s[MAXN], n,cnt=0;/*用x[MAX]记录第x列第几行应该有皇后,n为参数,cnt代表解决方法*/
void dfs(int x)
{
int i;
if (x==n+1)/*如果符合条件,输出结果*/
{
cnt++;
printf("solution %2d:",cnt);
for(i=1;i<=n;i++)
printf("%d",s[i]);
printf("\n");
}
for(i=1;i<=n;i++)
{
int t1=i-x+n,t2=i+x;/*正向对角线标号,逆向对角线标号,i为行,x为列*/
if (!u[i]&&!l[t1]&&!r[t2])/*判断行,正向对角线,逆向对角线是否已有皇后*/
{
s[x]=i;
l[t1]=r[t2]=u[i]=1;
dfs(x+1);/*回溯置零*/
l[t1]=r[t2]=u[i]=0;
}
}
}
int main()
{
n=8;
dfs(1);
printf("%d solution(s) in total!\n",cnt);
return 0;
}
八皇后问题的回溯算法
最新推荐文章于 2023-04-02 15:56:38 发布