源代码:
#include<stdio.h>
#include<math.h>
int sum = 0;
// 判断当前的皇后位置是否合法
int isLegal(int *place, int nowQueen)
{
for(int i=1;i<nowQueen;i++)
{
if( (abs(nowQueen-i) == abs(place[nowQueen]-place[i])) || place[nowQueen] == place[i])
return 0;
}
return 1;
}
// 子集树数实现n皇后函数(穷举)
// nowQueen 序号 为当前第nowQueen号的皇后寻找位置
int backTrack(int *place, int queenCount, int nowQueen)
{
if(nowQueen>queenCount)
{
sum++;
return 0;
}
else
{
for(int i=1;i<=queenCount;i++)
{
place[nowQueen] = i;
if(isLegal(place, nowQueen))
{
backTrack(place, queenCount, nowQueen+1);
}
}
}
}
// queenCount 皇后的总个数
// place[] 标记已经有位置的皇后, 例如place[3] = 5, 表示第3号皇后的位置是第3行第5列
// place[] 的下标有两个作用,表示第i号皇后和该皇后在第i行
// sum 统计所有情况
int main()
{
int queenCount;
scanf("%d", &queenCount);
int place[queenCount+1];
//从第一个皇后开始
backTrack(place, queenCount, 1);
printf("%d", sum);
return 0;
}