利用回溯法
#include <stdio.h>
int place[8] = {0}; //保存每行皇后位置
int flag[8] = {0}; // 列标记
int d1[16] = {0}; // 对角线1
int d2[16] = {0}; // 对角线2
int count = 0;
void place_queen(int x, int y) {
place[x] = y;
flag[y] = 1;
d1[x - y + 7] = 1; // 主对角线索引
d2[x + y] = 1; // 副对角线索引
}
void remove_queen(int x, int y) {
flag[y] = 0;
d1[x - y + 7] = 0;
d2[x + y] = 0;
}
void print() { // 打印皇后位置
int i, j;
int table[8][8] = {0};
count++; // 计算解的个数
printf("No. %d\n", count);
for (i = 0; i < 8; i++) {
table[i][place[i]] = 1; // 将place数组转为二维数组
}
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
printf("%d ", table[i][j]);
}
printf("\n");
}
printf("<================>\n");
}
void generation(int x) {
int y;
for (y = 0; y < 8; y++) {
// 判断是否冲突
if (!(flag[y] || d1[x - y + 7] || d2[y + x])) {
place_queen(x, y); // 放置皇后
if (x < 7) {
generation(x + 1); // 递归
} else {
print(); // 放完所有的皇后
}
remove_queen(x, y); // 回溯
}
}
}
int main() {
generation(0); // 从第0行开始放置
}