八皇后问题回溯法c++
时间: 2023-10-18 18:11:42 浏览: 137
C++基于回溯法解决八皇后问题示例
八皇后问题是经典的回溯算法问题,以下是C语言实现代码:
```c
#include<stdio.h>
#include<math.h>
int a[9] = {0}; // 存储皇后所在列号
int count = 0; // 解法总数
// 判断当前皇后所在位置是否合法
int check(int row, int col) {
for(int i=1; i<row; i++) {
if(a[i] == col || abs(i-row) == abs(a[i]-col)) {
return 0;
}
}
return 1;
}
// 递归求解八皇后问题
void queen(int row) {
if(row > 8) { // 找到一种解法
count++;
printf("No.%d solution: ", count);
for(int i=1; i<=8; i++) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
for(int i=1; i<=8; i++) {
if(check(row, i)) { // 如果当前位置合法,继续搜索下一行
a[row] = i;
queen(row+1);
a[row] = 0;
}
}
}
int main() {
queen(1);
printf("Total solutions: %d\n", count);
return 0;
}
```
该算法的基本思路是在每一行放置一个皇后,从第一行开始搜索,根据当前皇后所在列号判断其是否与之前已放置的皇后产生冲突,如果不冲突,则继续搜索下一行,否则回溯到上一行重新选择位置。当搜索到第9行时,表示找到一种解法,输出该解法,并继续搜索下一种解法。最后统计解法总数并输出即可。
阅读全文