您的位置:首页 > 其它

八皇后问题--递归求解

2016-03-29 21:08 393 查看
八皇后问题简述:在国际象棋中,皇后是最厉害的(这也就是大概为什么不要得罪女人的原因),她可以吃掉任意与其所在列和行,以及对角线上的棋子。所以在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: