递归解决八皇后问题c语言
时间: 2023-10-26 13:06:55 浏览: 115
八皇后问题是经典的递归问题,可以使用回溯法进行求解。下面是使用C语言实现的递归解决八皇后问题的代码:
```c
#include<stdio.h>
#include<stdlib.h>
#define N 8
int board[N][N]; // 棋盘
void print_board() // 打印棋盘
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
printf("\n");
}
int is_safe(int row, int col) // 判断当前位置是否安全
{
int i, j;
// 检查行和列
for (i = 0; i < N; i++) {
if (board[row][i] || board[i][col]) {
return 0;
}
}
// 检查对角线
for (i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j]) {
return 0;
}
}
for (i = row, j = col; i < N && j >= 0; i++, j--) {
if (board[i][j]) {
return 0;
}
}
return 1;
}
int solve(int col) // 递归求解
{
if (col == N) { // 找到了一组解
print_board();
return 1;
}
int i, count = 0;
for (i = 0; i < N; i++) {
if (is_safe(i, col)) {
board[i][col] = 1;
count += solve(col + 1);
board[i][col] = 0;
}
}
return count;
}
int main()
{
int count = solve(0);
printf("Total solutions: %d\n", count);
return 0;
}
```
上面的代码中,`board`是一个8x8的二维数组,用来表示棋盘。`is_safe`函数用来判断当前位置是否安全,即当前位置是否能放置皇后。`solve`函数是递归求解八皇后问题的核心函数,它从第0列开始,依次尝试在每一行中放置皇后,如果当前位置安全,则将皇后放置在该位置,并递归求解下一列的问题;如果当前位置不安全,则直接返回。当递归到第N列时,表示找到了一组解,输出该解,并返回1。最后在`main`函数中调用`solve`函数,并输出总共找到的解的个数。
阅读全文