C语言求解八皇后问题
时间: 2023-09-17 18:08:40 浏览: 130
八皇后问题是一个经典的递归回溯问题,以下是使用 C 语言解决八皇后问题的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define N 8
// 检查当前位置是否合法
bool is_valid(int board[N][N], int row, int col) {
// 检查列是否有冲突
for (int i = 0; i < row; i++) {
if (board[i][col] == 1) {
return false;
}
}
// 检查左上角到右下角的对角线是否有冲突
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 1) {
return false;
}
}
// 检查右上角到左下角的对角线是否有冲突
for (int i = row, j = col; i >= 0 && j < N; i--, j++) {
if (board[i][j] == 1) {
return false;
}
}
return true;
}
// 打印出解法
void print_solution(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
// 解决八皇后问题
bool solve_queens(int board[N][N], int row) {
// 如果所有的行都遍历完了,说明找到了一种解法
if (row == N) {
print_solution(board);
return true;
}
bool result = false;
// 遍历当前行的每一个列
for (int col = 0; col < N; col++) {
// 如果当前位置合法,将皇后放置在当前位置
if (is_valid(board, row, col)) {
board[row][col] = 1;
// 递归解决下一行
result = solve_queens(board, row + 1) || result;
// 如果下一行没有找到解法,将当前位置重置为 0
board[row][col] = 0;
}
}
// 如果在当前行的所有列都没有找到解法,返回 false
return result;
}
int main() {
int board[N][N] = {0};
solve_queens(board, 0);
return 0;
}
```
这段代码使用了一个二维数组 `board` 来表示棋盘,其中 `board[i][j]` 表示第 `i` 行第 `j` 列的位置是否有皇后。函数 `is_valid` 用于检查当前位置是否合法,如果合法则将皇后放置在当前位置,然后递归解决下一行。如果下一行没有找到解法,则将当前位置重置为 0,继续遍历下一列。如果在当前行的所有列都没有找到解法,返回 false。函数 `print_solution` 用于打印出解法。在 `main` 函数中,初始化棋盘并调用 `solve_queens` 函数解决八皇后问题。
阅读全文