利用递归,求八皇后问题,c语言
时间: 2024-09-27 16:01:41 浏览: 31
0积分下载C语言递归实现N皇后问题
八皇后问题是一个经典的回溯算法问题,它涉及到在一个8x8的棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列,以及同一条对角线上。递归是一种解决该问题的有效策略。以下是使用C语言基本的递归解决方案:
```c
#include <stdio.h>
// 定义函数,n表示当前寻找的位置,row用于记录已放置的皇后位置
void solve(int n, int row, int chessboard[8][8]) {
if (n == 8) { // 当所有位置都放好皇后,返回成功
puts("Solution found:");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (chessboard[i][j] == 1) {
printf("%d ", i);
}
}
printf("\n");
}
return;
}
// 检查当前位置是否安全,然后递归尝试其他位置
for (int j = 0; j < 8; j++) {
if (isValid(n, j, chessboard)) { // isValid检查位置是否合法
chessboard[n][j] = 1; // 放置皇后
solve(n + 1, row, chessboard); // 继续下一层递归
chessboard[n][j] = 0; // 回溯,移除皇后
}
}
}
// 判断当前位置是否合法
int isValid(int n, int j, int chessboard[8][8]) {
// 检查行、列和对角线是否有冲突
for (int i = 0; i < n; i++) {
if (chessboard[i][j] == 1 || // 同行
chessboard[n][i] == 1 || // 对角线
chessboard[i][i-j] == 1 || // 主对角线
chessboard[i][i+j] == 1) { // 反向主对角线
return 0;
}
}
return 1;
}
int main() {
int chessboard[8][8] = {0};
solve(0, 0, chessboard);
return 0;
}
阅读全文