以下是 N 皇后问题的 C 语言实现(n=4),程序会输出所有合法解,格式为 (X[1],X[2],X[3],X[4]):
#include <stdio.h>
#define N 4 // 皇后数量
// 判断第k行的皇后放置在X[k]列是否合法
int isPlace(int k, int X[]) {
int i;
// 检查前k-1行的皇后是否与第k行皇后冲突(同列或同斜线)
for (i = 1; i < k; i++) {
// 同列:X[i] == X[k]
// 同斜线:|i - k| == |X[i] - X[k]|
if (X[i] == X[k] || (i - k) == (X[i] - X[k]) || (i - k) == -(X[i] - X[k])) {
return 0; // 冲突,不可放置
}
}
return 1; // 合法,可放置
}
// 递归回溯求解N皇后
void solveNQueens(int row, int X[]) {
int col;
if (row > N) { // 找到一组解(所有行都放置了皇后)
printf("(%d,%d,%d,%d)\n", X[1], X[2], X[3], X[4]);
return;
}
// 尝试当前行的每一列
for (col = 1; col <= N; col++) {
X[row] = col; // 在第row行第col列放置皇后
if (isPlace(row, X)) { // 检查是否合法
solveNQueens(row + 1, X); // 合法则继续下一行
}
// 不合法则回溯,尝试下一列(X[row]会被新值覆盖)
}
}
int main() {
int X[N + 1]; // X[1]~X[4]分别表示第1~4行皇后的列号(忽略X[0])
printf("4皇后问题的解:\n");
solveNQueens(1, X); // 从第1行开始放置
return 0;
}
代码说明:
-
核心函数:
isPlace(k, X):判断第k行的皇后放在X[k]列是否合法(检查与前k-1行皇后是否同列或同斜线)。solveNQueens(row, X):递归回溯函数,从第row行开始放置皇后,若所有行都放好(row > N)则输出解。
-
输出结果:
4皇后问题有2组解,程序运行后输出:4皇后问题的解: (2,4,1,3) (3,1,4,2)如:
# 0代表空位,1代表皇后
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
- 逻辑说明:
- 数组
X下标1~4对应4行,值表示皇后所在的列号(列号从1开始)。 - 通过递归尝试每一行的每一列,若合法则继续下一行,否则回溯尝试下一列,直到找到所有解。
- 数组
1439

被折叠的 条评论
为什么被折叠?



