下面是一个非递归解决 n 皇后问题的示例代码:
#include <stdio.h>
#include <stdbool.h>
bool isSafe(int board[], int row, int col) {
// 检查当前位置是否安全(不与已放置的皇后冲突)
for (int i = 0; i < row; i++) {
if (board[i] == col || board[i] - i == col - row || board[i] + i == col + row) {
return false;
}
}
return true;
}
void solveNQueens(int n) {
int solutions = 0;
int* stack = malloc(n * sizeof(int)); // 使用栈来保存回溯过程中的状态
int row = 0, col = 0;
// 初始化第一行皇后位置为(0,0),将其入栈
stack[0] = 0;
while (row >= 0) {
while (col < n) {
if (isSafe(stack, row, col)) { // 检查当前位置是否安全
stack[row] = col; // 将当前位置入栈
if (row == n-1) { // 如果已经放置了最后一行的皇后,表示找到一个解决方案
solutions++;
break;
}
row++; // 进入下一行,从第0列开始搜索
col = 0;
} else {
col++; // 如果当前位置不安全,尝试下一个位置
}
}
if (col == n || row == -1) {
// 回溯到上一行
row--;
if (row >= 0) {
col = stack[row] + 1; // 继续从上一行的下一列开始搜索
}
}
}
printf("%d皇后问题共有%d种摆放方案\n", n, solutions);
free(stack);
}
int main() {
int n;
scanf("%d", &n);
solveNQueens(n);
return 0;
}
请将以上代码复制到编辑器的 Begin-End 部分,并输入要测试的皇后数目,运行代码即可得到相应的解决方案。
内容由零声教学AI助手提供,问题来源于学员提问




