八皇后

八皇后问题是一个以国际象棋为背景的问题:如何能够在 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[n][i]=1;        //若合适 标记为 1 
fun(n+1);             //进行下一行判断 
arr[n][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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值