以下是使用递归算法解决n皇后问题的示例代码:
#include <stdio.h>
#define MAX_N 10
int count = 0;
void printBoard(int board[MAX_N][MAX_N], int n) {
printf("第%d种方案:\n", ++count);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 1) {
printf("Q ");
} else {
printf("* ");
}
}
printf("\n");
}
printf("\n");
}
int isSafe(int board[MAX_N][MAX_N], int row, int col, int n) {
// 检查当前位置上方的所有行是否有皇后
for (int i = 0; i < row; i++) {
if (board[i][col] == 1) {
return 0;
}
}
// 检查左上对角线是否有皇后
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 1) {
return 0;
}
}
// 检查右上对角线是否有皇后
for (int i = row, j = col; i >= 0 && j < n; i--, j++) {
if (board[i][j] == 1) {
return 0;
}
}
return 1;
}
void solveNQueens(int board[MAX_N][MAX_N], int row, int n) {
if (row == n) {
printBoard(board, n);
return;
}
for (int col = 0; col < n; col++) {
if (isSafe(board, row, col, n)) {
board[row][col] = 1;
solveNQueens(board, row + 1, n);
board[row][col] = 0;
}
}
}
int main() {
int n;
printf("请输入n:");
scanf("%d", &n);
int board[MAX_N][MAX_N] = {0};
solveNQueens(board, 0, n);
printf("共有%d种摆放方案\n", count);
return 0;
}
在上述代码中,我们使用回溯法和递归来解决n皇后问题。其中solveNQueens函数用于逐行尝试放置皇后,并在每一行都找到合适的列进行放置。isSafe函数用于检查当前位置是否安全,即不会与已放置的皇后冲突。最后,printBoard函数用于打印出一种正确的摆放方案。
你可以将以上代码复制到编译器中运行,并输入不同的测试样例进行验证。
对于测试样例4,预期输出为两种摆放方案,并按照国际象棋的规则打印出了棋盘上皇后的位置。
内容由零声教学AI助手提供,问题来源于学员提问




