下面是一个递归解决 n 皇后问题的示例代码:
#include <stdio.h>
#include <stdbool.h>
void printSolution(int board[], int n) {
// 打印棋盘上的皇后位置
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i] == j) {
printf("Q ");
} else {
printf("* ");
}
}
printf("\n");
}
}
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 solveNQueensHelper(int board[], int row, int n, int* solutions) {
if (row >= n) { // 找到了一种解决方案
(*solutions)++;
printSolution(board, n);
printf("\n");
return;
}
for (int col = 0; col < n; col++) { // 在当前行中尝试每一列的位置
if (isSafe(board, row, col)) { // 检查当前位置是否安全
board[row] = col;
solveNQueensHelper(board, row+1, n, solutions); // 进入下一行
// 回溯到上一行
board[row] = -1;
}
}
}
void solveNQueens(int n) {
int solutions = 0;
int* board = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
board[i] = -1; // 初始化棋盘,-1 表示没有放置皇后
}
solveNQueensHelper(board, 0, n, &solutions);
printf("%d皇后问题共有%d种摆放方案\n", n, solutions);
free(board);
}
int main() {
int n;
scanf("%d", &n);
solveNQueens(n);
return 0;
}
请将以上代码复制到编辑器的 Begin-End 部分,并输入要测试的皇后数目,运行代码即可得到相应的解决方案。
内容由零声教学AI助手提供,问题来源于学员提问




