#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 8
int arr[N];
void queens(int *arr);
int checkPosition(int *arr, int i);
int main()
{
// 初始化数组
int i;
for(i = 0; i < N; i++) {
arr[i] = 0;
}
// 排列皇后
queens(arr);
system("PAUSE");
return 0;
}
// 排列皇后
void queens(int *arr)
{
// 初始化变量
int i = 1;
int j, k;
// 有多少种解
int total = 0;
while(i >= 1) {
// 在下一个位置放置第 i 个皇后
arr[i] = arr[i] + 1;
// 检查皇后放置的位置是否合法
while(arr[i] <= N && !checkPosition(arr, i)) {
// 搜索下一列
arr[i] = arr[i] + 1;
}
//得到一个输出
if(arr[i] <=N&&i==N) {
for(j = 1; j <= N; j++) {
for(k = 1; k <= N; k++) {
if(arr[j] == k) {
printf(" *");
} else {
printf(" .");
}
}
printf("\n");
}
printf("\n");
total++;
} else if(arr[i] <= N && i < N) {
// 放置下一个皇后
++i;
} else {
// 回溯
arr[i] = 0;
--i;
}
}
printf("There are %d answers!\n\n", total);
}
// 检查皇后 x 放在 arr[x] 位置是否会有冲突
int checkPosition(int *arr, int x)
{
int i;
for(i = 1; i < x; i++) {
if(arr[i] == arr[x] || abs(x - i) == abs(arr[x] - arr[i])) {
return 0;
}
}
return 1;
}