回溯法求解四皇后问题C语言代码
时间: 2023-08-18 19:33:27 浏览: 128
以下是回溯法解决四皇后问题的C语言代码实现:
```c
#include <stdio.h>
#include <stdbool.h>
#define N 4
int chessboard[N]; // 存储皇后所在的列
// 判断是否可以放置皇后
bool can_place(int row, int col) {
for (int i = 0; i < row; i++) {
if (chessboard[i] == col ||
chessboard[i] - i == col - row ||
chessboard[i] + i == col + row) {
return false;
}
}
return true;
}
// 回溯法求解
bool backtrack(int row) {
// 遍历完所有行,成功返回true
if (row == N) {
return true;
}
// 遍历列
for (int col = 0; col < N; col++) {
// 判断当前位置是否可以放置皇后
if (can_place(row, col)) {
// 放置皇后
chessboard[row] = col;
// 继续放置下一行皇后
if (backtrack(row + 1)) {
return true;
}
// 如果下一行放置失败,则回溯到当前行重新放置皇后
chessboard[row] = -1;
}
}
return false;
}
int main() {
// 初始化棋盘
for (int i = 0; i < N; i++) {
chessboard[i] = -1;
}
// 从第一行开始递归放置皇后
backtrack(0);
// 输出皇后在棋盘上的位置
for (int i = 0; i < N; i++) {
printf("%d ", chessboard[i]);
}
printf("\n");
return 0;
}
```
其中,can_place()用于判断当前位置是否可以放置皇后,backtrack()用于递归放置皇后。在递归过程中,如果成功放置所有皇后,则返回True,否则回溯到上一行重新放置皇后。最终,输出皇后在棋盘上的位置。
阅读全文