您的位置:首页 > 其它

八皇后

2016-07-26 09:14 183 查看
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,

使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横

行、纵行或斜线上。 

对于八皇后问题,每次放置皇后时都要找到一个合适的位置,我们可以先放第一行,然后从第一列到最后一列每个位置都去尝试,判断在此位置的同一横行,竖行,斜线(有两条)上是否放有其他皇后,若有其他皇后,则在此行的下一个位置尝试,找到合适位置后,在下一行以同样的方式去寻找,当八个皇后全部放置后说明已经找到了一种方式,寻找其他方式时,我们可以先把最后一个皇后(即第八行放置的皇后)回收(取消标记),回到上一个皇后(第七行),向下一个位置尝试,若找到合适位置,则在第八行以同样的方式寻找合适位置,若没有找到合适位置,回收第七行皇后(取消标记),则回到上一个皇后(第六行)以同样的方式进行尝试,直到找到全部的合适位置

  #include<stdio.h>

  int count=0;

 void printf_arr();

  int judge(int ,int );

 void fun(int);


 int arr[8][8]={0};      
//二维数组模拟棋盘,初始化为 0 

int main()

{

fun(0);
printf("%d\n",count);

    return 0;

}

void fun(int n)

{
int i;
if(n==8)
{
count++;
printf_arr();
}
else
for(i=0;i<8;i++)
{
if(judge(n,i)==1)    
//调用函数找出第n行合适的位置 
{
arr
[i]=1;        //若合适 标记为 1 
fun(n+1);            
//进行下一行判断 
arr
[i]=0;        
 // 取消标记 即回收此皇后 进行下一次尝试
}

}


}

int judge(int x,int y)           //因为是由上向下遍历,所以只需判断此行上面部分

{
int i,j;
for(i=x;i>=0;i--)           //判断此列上方是否存在其他皇后
{
if(arr[i][y]==1)
{
return 0;


for(i=x,j=y;i>=0&&j>=0;i--,j--)      
//判断斜线左上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j<8;i--,j++)        
 // 判断斜线右上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
return 1;

}

void  printf_arr()


int i,j;
for( i=0;i<8;++i)              // 输出合适的方法 
{
for( j=0;j<8;++j)
printf("%2d", arr[i][j]);
printf("\n");
}
printf("\n");

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