八皇后问题--递归求解

八皇后问题简述:在国际象棋中,皇后是最厉害的(这也就是大概为什么不要得罪女人的原因),她可以吃掉任意与其所在列和行,以及对角线上的棋子。所以在8X8的棋盘上,安放8个皇后,使得不会相互攻击,也就是安全的就变得极为重要。本文采用递归的方式,输出所有的92种可能的方法。代码如下:

#include "stdafx.h"
#include "windows.h"
//#include "cnoio.h"

int count =0;
int notDanger(int row,int j,int (*chess)[8]){

	int i=0,k;int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;

	for(i=0;i<8;i++)//列
	{
		if(*(*(chess+i)+j) !=0){
			flag1 = 1;
			break;
		}
	}
	for(i=row,k=j;i>=0 && k>=0;i--,k--)//左上方
	{
		if(*(*(chess+i)+k) !=0){
			flag2 = 1;
			break;
		}
	}
	for(i=row,k=j;i<8 && k<8;i++,k++)//右下方
	{
		if(*(*(chess+i)+k) !=0){
			flag3 = 1;
			break;
		}
	}
	for(i=row,k=j;i>=0 && k<8;i--,k++)//右上方
	{
		if(*(*(chess+i)+k)!=0){
			flag4 = 1;
			break;
		}
	}
	for(i=row,k=j;i<8&&k>=0;i++,k--)//右下方
	{
		if(*(*(chess+i)+k)!=0){
			flag5 = 1;
			break;
		}
	}
	if(flag1||flag2||flag3||flag4||flag5){
		
		return 0;
	}else{
		return 1;
	}
}

void Eightqueen(int row,int n,int (*chess)[8])
{

	int copyChess[8][8];int i,j;
	for( i =0;i<8;i++)
	{
		for( j =0;j<8;j++)

			copyChess[i][j]=chess[i][j];
	}
	if(row==8)
	{
		printf("第 %d 种\n",++count);
		for(i =0;i<8;i++)
		{
			for( j =0;j<8;j++)
				printf("%d ",copyChess[i][j]);
			printf("\n");
		}
		printf("\n");
	}
	else{

		for(int j =0;j< n;j++){

			if(notDanger(row,j,chess)){

				for(int i =0;i<8;i++)
					*(*(copyChess+row)+i)= 0;

				*(*(copyChess+row)+j)= 1;
				Eightqueen(row+1,n,copyChess);
			}
		}
	}

}
int _tmain(int argc, _TCHAR* argv[])
{
	//system("color FA");
	int chess[8][8];
	int i=0,j;
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			chess[i][j] =0;
	Eightqueen(0,8,chess);
	getchar();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值