n皇后问题回溯法c语言
时间: 2023-10-06 11:14:04 浏览: 69
回溯法之N皇后问题C语言.doc
n皇后问题是一个经典的回溯算法问题,下面是C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 8
int chessboard[N][N]; // 棋盘
int count = 0; // 统计解的个数
// 判断在(row, col)位置上是否可以放置皇后
int isSafe(int row, int col) {
int i, j;
// 检查该列上方的行
for (i = 0; i < row; i++) {
if (chessboard[i][col]) {
return 0;
}
}
// 检查左上方的对角线
for (i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (chessboard[i][j]) {
return 0;
}
}
// 检查右上方的对角线
for (i = row, j = col; i >= 0 && j < N; i--, j++) {
if (chessboard[i][j]) {
return 0;
}
}
return 1;
}
// 输出棋盘
void printChessboard() {
int i, j;
printf("Solution %d:\n", count);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", chessboard[i][j]);
}
printf("\n");
}
}
// n皇后问题的回溯算法实现
void nQueen(int row) {
int i;
// 找到一个解
if (row == N) {
count++;
printChessboard();
return;
}
// 在下一行找到一个合适的列放置皇后
for (i = 0; i < N; i++) {
if (isSafe(row, i)) {
chessboard[row][i] = 1;
nQueen(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;
}
}
nQueen(0);
if (count == 0) {
printf("No solution found.\n");
} else {
printf("Total %d solutions found.\n", count);
}
return 0;
}
```
上述代码会输出所有的解,其中 `chessboard` 数组表示棋盘,每行一个皇后,1表示该位置上有皇后,0表示该位置上无皇后。`isSafe` 函数判断在 (row, col) 位置上是否可以放置皇后,如果可以则返回1,否则返回0。`nQueen` 函数为回溯函数,当 row == N 时找到一个解,输出该解并返回;否则在下一行找到一个合适的列放置皇后,继续搜索。
阅读全文