码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2015-04-13 09:46:28      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:排序算法   八皇后   计算机   算法   

八皇后问题


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

本部分,使用递归问题进行求解,参考源码如下:

#include <stdio.h>
#include <stdlib.h>

#define MAX_IN 8
/*全局变量自动初始化为0*/
char matrix[MAX_IN][MAX_IN]={0};
int counts=0;


int not_danger(int row,int j,char(*mat)[MAX_IN])
{
	int i,k;
	
	/*判断列方向是否有危险*/
	for(i=0;i<MAX_IN;i++)
		if(*(*(mat+i)+j)!=0)
			return 0;
	
	/*判断左上方是否有危险*/
	for(i=row,k=j;i>=0 && k>=0;i--,k--)
		if(*(*(mat+i)+k)!=0)
			return 0;
	
	/*判断右下方是否有危险*/
	for(i=row,k=j;i<MAX_IN && k<MAX_IN;i++,k++)
		if(*(*(mat+i)+k)!=0)
			return 0;
	
	/*判断右上方是否有危险*/
	for(i=row,k=j;i>=0&&k<MAX_IN;i--,k++)
		if(*(*(mat+i)+k)!=0)
			return 0;
	
	/*判断右上方是否有危险*/
	for(i=row,k=j;i<MAX_IN && k>=0;i++,k--)
		if(*(*(mat+i)+k)!=0)
			return 0;
	return 1;
}



/*row 表示启始行,n表示列*/

void Eight_Queue(int row,int n,char(*mat)[MAX_IN])
{
	char chess2[MAX_IN][MAX_IN];
	int i,j;
	for(i=0;i<MAX_IN;i++)
		for(j=0;j<MAX_IN;j++)
			chess2[i][j]=mat[i][j];
		//memcpy(chess2,mat,8*8);
	
	if(MAX_IN==row)
	{
		printf("第%d种:\n",counts+1);
		for(i=0;i<MAX_IN;i++)
		{
			for(j=0;j<MAX_IN;j++)
				printf("%c ",*(*(chess2+i)+j));
			printf("\n");
		}
		printf("\n");
		counts++;
	}
	else
	{
		/*判断这个位置是否有危险,如果有危险,如过没有危险继续往下*/
		for(j=0;j<n;j++)
		{
			if(not_danger(row,j,mat))/*判断是否危险*/
			{
				for(i=0;i<MAX_IN;i++)
				{
					*(*(chess2+row)+i)=0;
				}
				*(*(chess2+row)+j)=1;
				Eight_Queue(row+1,n,chess2);
			}
		}
	}
}

int main(int argc,char**argv)
{
	Eight_Queue(0,8,matrix);
	printf("\n共有解决方法:%d\n",counts);
	return 0;
}


八皇后问题

标签:排序算法   八皇后   计算机   算法   

原文地址:http://blog.csdn.net/u011889952/article/details/45012167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!