中心思想:同一行同一列和同一斜队不能有两个皇后,不然两人会打架,我们要保证两个皇后和平相处
#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;
}