八皇后问题c语言
时间: 2023-08-24 17:20:05 浏览: 102
八皇后问题(C语言)
八皇后问题是一个经典的回溯算法问题,在 C 语言中可以使用递归实现。具体实现步骤如下:
1.定义一个二维数组 chessboard 存储棋盘状态。
2.定义一个 bool 类型的函数 check 判断当前位置是否合法。
3.定义一个递归函数 solve,实现回溯算法。
4.在 solve 函数中,使用双重循环遍历棋盘的每一个位置,如果当前位置合法,则将皇后放置在该位置,并将棋盘状态更新。
5.在递归函数中,如果已经成功放置了 8 个皇后,则说明找到了一组解,输出该解。
6.如果当前位置不合法,则回溯到上一个位置,继续遍历下一个位置。
下面是 C 语言的八皇后问题实现代码:
```c
#include<stdio.h>
#include<stdbool.h>
#define N 8 // 定义棋盘大小
int chessboard[N][N]; // 定义棋盘
// 判断当前位置是否合法
bool check(int row, int col) {
int i, j;
// 检查同一列是否有皇后
for (i = 0; i < row; i++) {
if (chessboard[i][col] == 1) {
return false;
}
}
// 检查左上方是否有皇后
for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (chessboard[i][j] == 1) {
return false;
}
}
// 检查右上方是否有皇后
for (i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) {
if (chessboard[i][j] == 1) {
return false;
}
}
return true;
}
// 递归求解八皇后问题
void solve(int row) {
int i, j;
if (row == N) { // 如果已经成功放置了 8 个皇后,则输出该解
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", chessboard[i][j]);
}
printf("\n");
}
printf("\n");
return;
}
for (i = 0; i < N; i++) { // 遍历棋盘的每个位置
if (check(row, i)) { // 如果当前位置合法,则放置皇后
chessboard[row][i] = 1;
solve(row + 1);
chessboard[row][i] = 0; // 回溯到上一个位置
}
}
}
int main() {
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
chessboard[i][j] = 0; // 初始化棋盘
}
}
solve(0); // 从第一行开始求解八皇后问题
return 0;
}
```
在上述代码中,我们使用了一个二维数组 chessboard 存储棋盘状态,其中 0 表示该位置没有皇后,1 表示该位置有皇后。在 check 函数中,我们检查当前位置是否与已放置的皇后冲突。在 solve 函数中,我们使用双重循环遍历棋盘的每一个位置,如果当前位置合法,则将皇后放置在该位置,并将棋盘状态更新。如果已经成功放置了 8 个皇后,则说明找到了一组解,输出该解。如果当前位置不合法,则回溯到上一个位置,继续遍历下一个位置。
阅读全文