八皇后递归解决

中心思想:同一行同一列和同一斜队不能有两个皇后,不然两人会打架,我们要保证两个皇后和平相处

#include<stdio.h>
int count=0;
//判断是否危险
int isDanger(int row,int col,int (*chess)[8])
{
 //行、列、左上,右下、右上、左下
  int i,j;
  //行 
  for(j=0;j<8;j++)
  {
   if(chess[row][j]==1)
      return 0;
  }
  //列 
  for(i=0;i<8;i++)
  {
   if(chess[i][col]==1)
     return 0;
  }
  //左上 
  for(i=row,j=col;i>=0&&j>=0;i--,j--)
  {
   if(chess[i][j]==1)
     return 0;
  }
  //右下 
  for(i=row,j=col;i<8&&j<8;i++,j++)
  {
   if(chess[i][j]==1)
     return 0;
  }
  //左下 
  for(i=row,j=col;i<8&&j>=0;i++,j--)
  {
   if(chess[i][j]==1)
     return 0;
  }
  //右上 
  for(i=row,j=col;i>=0&&j<8;i--,j++)
  {
   if(chess[i][j]==1)
     return 0;
  }
   
  return 1;
} 
void EightQueen(int row,int col,int (*chess)[8])
{
 //先用一个临时棋盘保存值
  int chess2[8][8],i,j;
  for(i=0;i<8;i++)
  {
   for(j=0;j<8;j++)
      chess2[i][j]=chess[i][j];
  }
  //输出棋盘 
  if(row==8)
  {
   printf("第%d 种\n",count+1);
   count++;
   for(i=0;i<8;i++)
   {
    for(j=0;j<8;j++)
    {
     printf("%d ",chess2[i][j]);
   }
    printf("\n");
  }
  printf("\n");
  }
  //摆放皇后的位置 
  else
  {
   for(j=0;j<col;j++)
   {
    if(isDanger(row,j,chess))//判断是否有危险 
    {
     for(i=0;i<8;i++)
        chess2[row][i]=0;
     chess2[row][j]=1;
    EightQueen(row+1,col,chess2); 
   }
  }  
  }
}
int main()
{
 int chess[8][8],i,j;
 for(i=0;i<8;i++)
 {
  for(j=0;j<8;j++)
  {
   chess[i][j]=0;
  }
 }
 EightQueen(0,8,chess);
 printf("共有%d种方法\n",count);
 return 0;
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值