如何用C语言解决八皇后问题(棋盘覆盖问题)?
时间: 2024-12-16 12:32:25 浏览: 9
八皇后问题是一个经典的回溯算法问题,在C语言中可以采用递归的方式来解决。以下是基本步骤:
1. 定义一个二维数组`board`表示棋盘,其中每个元素0表示该位置未放置皇后,1表示放置了皇后。
2. 定义一个函数`isSafe(row, col)`,检查当前位置`(row, col)`是否安全,即该行、该列以及左上到右下的对角线范围内是否存在皇后。
3. 主函数`solveNQueens(n)`中,初始化第一个皇后的位置为`col = 0`,然后递归尝试将皇后放在每一行的不同列上,直到`col == n`。
4. 在递归过程中,如果发现当前位置安全,就设置`board[row][col]`为1,并继续尝试下一个位置;如果不安全,则回溯到上一个位置并尝试其他列。当所有列都尝试完毕后,回到上一行继续搜索,直到找到解决方案或者无解为止。
5. 如果找到了一个合法的布局(所有的行、列和对角线上都没有两个相同的皇后),就在当前布局的基础上返回true;如果没有找到,回溯并继续搜索。
6. 当主函数结束时,如果没有找到解决方案,说明原问题无解,返回false。
```c
#include <stdio.h>
#define N 8
// 检查列和对角线是否安全
int isSafe(int board[N], 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 0;
}
return 1;
}
// 递归求解八皇后问题
void solveNQueens(int board[N], int col) {
if (col >= N) { // 找到一个解决方案
printSolution(board);
return;
}
// 尝试每一种放法
for (int i = 0; i < N; i++) {
if (isSafe(board, col, i)) {
board[col] = i; // 放置皇后
solveNQueens(board, col + 1); // 递归下一列
board[col] = 0; // 回溯,移除皇后
}
}
}
// 打印解决方案
void printSolution(int board[N]) {
for (int i = 0; i < N; i++, printf("\n"))
for (int j = 0; j < N; j++)
if (board[i] == j)
printf("Q ");
else
printf(". ");
}
int main() {
int board[N];
solveNQueens(board, 0);
return 0;
}
```
阅读全文