用c语言实现n皇后问题
时间: 2023-08-13 07:12:30 浏览: 134
以下是使用递归回溯算法来解决n皇后问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 8
int chessboard[N][N] = {0}; // 棋盘,0表示该位置没有皇后,1表示该位置有皇后
// 判断当前位置是否可以放皇后
int is_valid(int row, int col)
{
int i, j;
// 判断同一列是否已经有皇后
for (i = 0; i < row; i++) {
if (chessboard[i][col] == 1) {
return 0;
}
}
// 判断左上角到右下角的对角线是否已经有皇后
for (i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (chessboard[i][j] == 1) {
return 0;
}
}
// 判断右上角到左下角的对角线是否已经有皇后
for (i = row - 1, j = col + 1; i >= 0 && j < N; i--, j++) {
if (chessboard[i][j] == 1) {
return 0;
}
}
return 1;
}
// 递归回溯算法求解n皇后问题
void n_queen(int row)
{
int i, j;
// 找到一组解
if (row == N) {
printf("一组解:\n");
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 (is_valid(row, i)) { // 判断该位置是否可以放皇后
chessboard[row][i] = 1; // 放置皇后
n_queen(row + 1); // 递归求解下一行
chessboard[row][i] = 0; // 回溯,撤销当前位置的皇后
}
}
}
int main()
{
n_queen(0); // 从第0行开始求解
return 0;
}
```
该程序通过递归回溯算法遍历棋盘上的所有位置,对于每个位置进行判断是否可以放置皇后。如果可以放置,则将该位置赋值为1,递归求解下一行;如果不行,则回溯到上一行重新尝试其他位置。最终,如果遍历了棋盘上的所有位置,且每行都放置了一个皇后,则找到了一组解。
阅读全文