回溯法求八皇后c语言
时间: 2023-08-24 08:07:51 浏览: 87
回溯法是一种常用于解决排列组合问题的算法,下面是使用C语言实现八皇后问题的回溯法示例代码:
```c
#include<stdio.h>
#define N 8
int board[N][N];
// 打印棋盘
void printBoard() {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
printf("\n");
}
// 检查当前位置是否可以放置皇后
int isSafe(int row, int col) {
int i, j;
// 检查当前列是否有皇后
for(i=0; i<row; i++) {
if(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>=0 && j<N; i--, j++) {
if(board[i][j])
return 0;
}
return 1;
}
// 使用回溯法解决八皇后问题
int solveNQueen(int row) {
// 所有行都被遍历,打印结果
if(row == N) {
printBoard();
return 1;
}
int res = 0;
// 遍历当前行的每一列,尝试放置皇后
for(int col=0; col<N; col++) {
if(isSafe(row, col)) {
// 在当前位置放置皇后
board[row][col] = 1;
// 递归地尝试下一行
res = solveNQueen(row + 1) || res;
// 回溯,撤销当前位置的皇后
board[row][col] = 0;
}
}
return res;
}
int main() {
// 初始化棋盘
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
board[i][j] = 0;
}
}
// 求解八皇后问题
solveNQueen(0);
return 0;
}
```
这段代码会输出所有可能的八皇后解决方案。每个解决方案中,数字1表示一个皇后的位置,数字0表示空白位置。运行代码后,会输出所有可能的解决方案。注意,八皇后问题有多个解,每次运行可能得到不同的结果。
阅读全文