注意主对角线和副对角线的判断
#include <stdio.h>
int pat[8][8] = {0};
int count = 0;
void findQueen(int row);
void printQueen();
bool check(int row,int column);
void findQueen(int row)
{
if(row > 7)
{
count++;
printQueen();
return;
}
for(int column = 0;column < 8;column++)
{
if(check(row,column))
{
pat[row][column] = 1;
findQueen(row+1);
pat[row][column] = 0;//回退
}
}
}
void printQueen()
{
for(int i = 0;i < 8;i++)
{
for(int j = 0;j < 8;j++)
printf("%2d",pat[i][j]);
printf("\n");
}
printf("\n");
}
bool check(int row,int column)
{
//列
for(int i = 0;i < row;i++)
{
if(pat[i][column] == 1)
return false;
}
int j;
i = row - 1;
j = column - 1;
//主对角线
while(i >= 0 && j >= 0)
{
if(pat[i][j] == 1)
return false;
i--;
j--;
}
i = row - 1;
j = column + 1;
//负对角线
while(i >= 0 && j < 8)
{
if(pat[i][j] == 1)
return false;
i--;
j++;
}
return true;
}
void main()
{
findQueen(0);
printf("%d\n",count);
}