N皇后回溯算法(c语言代码)
问题重述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。推而广之,那么n个皇后有多少摆法。
代码:
//n皇后问题
#include<stdio.h>
#include<stdlib.h>
#define NUM 100
int x[NUM];
int place(int k){//位置判断函数
int i;
for(i=1;i<k;i++)
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k)) //是否在同一列或者在同一对角线
return true;
return false;
}
int queen(int n)
{int count=0;
for(int i=1;i<=n;i++)//放置位置初始化
x[i]=0;
int k=1;//棋盘的行数
while(k>=1)
{ x[k]=x[k]+1; //第一列
while(x[k]<=n&&place(k))
x[k]=x[k]+1;// 下一列
if(x[k]<=n)//越界否
{
if(k==n) //摆完了
{count++;
printf("%d皇后第%d种摆法为:\n",n,count);
for(int i=1;i<=n;i++) //输出结果
printf("(%d,%d)\n",i,x[i]);
}
else //下一行
{
k++;
}
}
else //越界了回溯
{x[k]=0;
k=k-1;
}
}
return count;
}
int main(void)
{int n;
printf("输入皇后的个数\n");
scanf("%d",&n);
printf("%d个皇后一共有%d摆法\n",n,queen(n));
return 0;
}