您的位置:首页 > 其它

经典递归八皇后问题

2016-01-08 09:55 246 查看
八皇后问题,是一个古老而著名的问题,是递归算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。

代码如下:

#include<stdio.h>
#include<stdlib.h>
const int N=10;                //最多皇后个数
int a
;                      //存放各皇后所在行号
int count=0;                   //记录解的个数
void print(int n)              //输出一个解
{
	int i;
	count++;
	printf("%d:  ",count);
	for(i=1;i<=n;i++)
		printf("(%d,%d) ",a[i],i);  //a[i]表示皇后所在棋盘的行,i表示皇后所在棋盘的列
	    printf("\n");
}
int find(int i,int k)          //测试第k列上i行能否摆上皇后
{
	int j;
	j=1;
	while(j<k)                 //j=1到k-1是已经放置了皇后的列
	{
		if((a[j]==i)||(abs(a[j]-i)==abs(j-k))) //判断第j列皇后是否在第i行上,位置(x[j],j)与(i,k)是否同对角线
			return 0;
		j++;
	}
	return 1;
}
void place(int k,int n)                       //第k个皇后放在第k列上
{ 
    int i;
	if(k>n)                                   //所有皇后放置结束
		print(n);
	else
		for(i=1;i<=n;i++)                     //第k列上穷举每一个位置
			if(find(i,k))
			{
				a[k]=i;
				place(k+1,n);
			}
}
int main()
{
	place(1,8);
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: