文章
232
粉丝
165
获赞
377
访问
126.4k
#include <bits/stdc++.h>
// 初始化全局标记数组(N最大10,对角线最大长度20)
int col[11] = {0}; // 标记列是否被占用:col[j]=1表示第j列有皇后
int diag1[21] = {0}; // 标记主对角线(左上→右下):行-列=定值,+10避免负数
int diag2[21] = {0}; // 标记副对角线(右上→左下):行+列=定值
int count; // 统计合法解法数
// 回溯函数:row表示当前要放置皇后的行,n表示棋盘大小
void backtrack(int row, int n) {
// 递归终止:所有行都放置了皇后,找到一种解法
if (row == n) {
count++;
return;
}
// 遍历当前行的每一列,尝试放置皇后
for (int j = 0; j < n; j++) {
// 检查:当前列、主对角线、副对角线均未被占用
if (!col[j] && !diag1[row - j + n] && !diag2[row + j]) {
// 放置皇后,标记占用
col[j] = 1;
diag1[row - j + n] = 1;
diag2[row + j] = 1;
// 递归处理下一行
backtrack(row + 1, n);
// 回溯:撤销标记,尝试下一列
col[j] = 0;
diag1[row - j + n] = 0;
diag2[row + j] = 0;
}
}
}
int main() {
int n;
// 循环读取输入,N=0时结束
while (std::cin >>...
登录后发布评论
暂无评论,来抢沙发