这里用0表示空位,用1表示皇后所在的位置
这里说一下当初有点不理解的地方:
79行将第row行所有元素赋值为0,之前觉得在开头已经初始化为0了,一直想不通为什么要再赋一次。
其实仔细看下代码就会发现如果将第一种情况输出之后chess[8][8]是有值的存放的是第一种情况,为了不影响下一次使用,在判断每一行的时候将其先赋值为0.
#include <stdio.h>
int count=1;
// 判断该位置是否安全 row:该位置的行 j:该位置的列
int notdanger(int row,int j,int chess2[8][8])
{
int i,k;
//列安全
for(i=0;i<8;i++)
{
if(chess2[i][j]==1)
return 0;
}
//左上安全
for(i=row,k=j;i>=0&&k>=0;i--,k--)
{
if(chess2[i][k]==1)
return 0;
}
//右下安全
for(i=row,k=j;i<8&&k<8;i++,k++)
{
if(chess2[i][k]==1)
return 0;
}
//右上安全
for(i=row,k=j;i>=0&&k<8;i--,k++)
{
if(chess2[i][k]==1)
return 0;
}
//左下安全
for(i=row,k=j;i<8&&k>=0;i++,k--)
{
if(chess2[i][k]==1)
return 0;
}
return 1;
}
//主要实现函数
//row:表示起始行
//因为是固定的8列就没有再写一个参数表示列
void eightqueen(int row,int chess[8][8])
{
int chess2[8][8];
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
chess2[i][j]=chess[i][j];
}
}
if(row==8)
{
printf("第%d种情况\n",count++);
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
printf("%d ",chess2[i][j]);
}
putchar('\n');
}
}
else
{
for(int j=0;j<8;j++) //j表示列
{
if(notdanger(row,j,chess2)) //判断该位置是否安全
{
for(int i=0;i<8;i++)
{
chess2[row][i]=0;
}
chess2[row][j]=1;
eightqueen(row+1,chess2);
}
}
}
}
int main()
{
int chess[8][8]={0};
eightqueen(0,chess);
return 0;
}