#include<stdio.h>
#include<stdbool.h>
#include<iostream>
const int N = 9; // 足够大的数组大小
int a[N]; // a[i] 表示第 i 行上的皇后放在第 a[i] 列上 (从 0 开始计数)
int n;
// 检查 (x, y) 位置是否可以放置皇后
bool check(int x, int y) {
for (int i = 0; i < x; i++) {
if (a[i] == y) return false; // 检查列
if (i - a[i] == x - y) return false; // 检查左上到右下对角线
if (i + a[i] == x + y) return false; // 检查左下到右上对角线
}
return true;
}
// 深度优先搜索放置皇后
void dfs(int row) {
if (row == n) {
// 找到一组解,打印棋盘
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j == a[i]) printf("Q "); // 皇后位置
else printf(". "); // 空位置
}
printf("\n");
}
printf("\n"); // 输出解后换行
return;
}
for (int i = 0; i < n; i++) { // 从第0列到第n-1列尝试放置
if (check(row, i)) {
a[row] = i;
dfs(row + 1);
a[row] = -1; // 撤销放置,回溯
}
}
}
int main() {
scanf("%d", &n);
dfs(0); // 从第0行开始放置
return 0;
}
N皇后问题(输出皇后摆放)
最新推荐文章于 2024-09-27 14:28:55 发布