C语言八皇后算法

今天通过网上学习C语言 了解八皇后算法:

满足八皇后的条件就是 在8×8的棋局中 要摆放8个皇后 使他们不能在同一行同一列和同一条对角线 求出所有的解法

具体代码如下:

#in
	return 0;#include<stdio.h>
int count=0;//全局变量 
int notDanger(int row,int j,int (*chess)[8])
{
 int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
 //判断列方向 
 for(i=0;i<8;i++)
    {
     if(*(*(chess+i)+j)!=0)
        {
         flag1=1;
         break;
 }
 }
 //判断对角线 需要判断4个方位 
 //判断左上方
 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<8&&k>=0;i++,k--)
 {
 if(*(*(chess+i)+k)!=0)
 {
 flag4=1;
 break;
 }
    //判断右上方 
   for(i=row,k=j;i>=0&&k<8;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]) //row 起始行 参数n表示列数 参数 (*chess)[0] 表示指向棋盘每一行的指针 
{
 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(8 == row)
 {
 printf("第%d种\n",count+1);
 for(i=0;i<8;i++)
 {
 for(j=0;j<8;j++)
 {
 printf("%d ",*(*(chess2+i)+j)); 
 }
 printf("\n");
 
 }
 printf("\n");
 count++;
  else
 {
 //判断这个位置是否有危险
 //如果没有危险?继续往下 
       for(j=0;j<n;j++)
    {
 if( notDanger(row,j,chess)) //判断是否危险 
 {
 for(i=0;i<8;i++)
 {
 *(*(chess2+row)+i)=0;   //先假设整行都危险 全部赋值为0 
   *(*(chess2+row)+j)=1;      // (row,j)为皇后位置,位置赋值为1 
  EightQueen(row+1,n,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\n",count); 
 return 0;
}
}

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/qq_41698081/article/details/79337671
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞