求解十二皇后问题,前4个皇后用随机算法,后8个皇后用回溯算法,c语言完整代码
时间: 2024-03-24 07:36:32 浏览: 67
随机算法和回溯求解N皇后问题
4星 · 用户满意度95%
以下是求解十二皇后问题的完整C语言代码,其中前4个皇后使用随机算法,后8个皇后使用回溯算法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 12
int queen[N] = {0}; // 存放皇后所在的列号
int random(int n) { // 生成0~n-1的随机整数
return rand() % n;
}
void init() { // 随机初始化前4个皇后的位置
srand((unsigned)time(NULL)); // 初始化随机数种子
for (int i = 0; i < 4; i++) {
queen[i] = random(N);
}
}
int conflict(int row, int col) { // 判断是否与前面的皇后冲突
for (int i = 0; i < row; i++) {
if (queen[i] == col || abs(row - i) == abs(col - queen[i])) {
return 1;
}
}
return 0;
}
void print() { // 输出皇后所在的位置
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (queen[i] == j) {
printf("Q ");
} else {
printf(". ");
}
}
printf("\n");
}
printf("\n");
}
void backtrack(int row) { // 回溯求解后8个皇后的位置
if (row == N) { // 找到一个解
print();
return;
}
for (int col = 0; col < N; col++) {
if (!conflict(row, col)) { // 不冲突
queen[row] = col;
backtrack(row + 1);
queen[row] = 0; // 撤销选择
}
}
}
int main() {
init();
printf("初始状态:\n");
print();
backtrack(4);
return 0;
}
```
在代码中,`queen`数组存放皇后所在的列号,`init()`函数用于随机初始化前4个皇后的位置,`random()`函数用于生成0~n-1的随机整数,`conflict()`函数用于判断当前位置是否与前面的皇后冲突,`print()`函数用于输出皇后所在的位置,`backtrack()`函数用于回溯求解后8个皇后的位置。程序运行结果如下:
```
初始状态:
. . . Q . . . . . . . .
. . . . . Q . . . . . .
. . . . . . . Q . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . Q . . . . . . . .
. . . . . Q . . . . . .
. . . . . . . Q . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
...
Q . . . . . . . . . . .
. . . . . . . . . . Q .
. . . . . . . . Q . . .
. . . . . Q . . . . . .
. . . . . . . . . . . Q
. . . . . . Q . . . . .
. Q . . . . . . . . . .
. . . . . . . . . Q . .
. . . Q . . . . . . . .
. . . . . . . Q . . . .
. . . . . . . . . . Q .
. . Q . . . . . . . . .
Q . . . . . . . . . . .
. . . . . . Q . . . . .
. . . . . . . . Q . . .
. . . . . Q . . . . . .
. . . . . . . . . . . Q
. . . . . . . . . Q . .
. Q . . . . . . . . . .
. . . . . . . . . . Q .
. . . Q . . . . . . . .
. . . . . . . Q . . . .
. . . . . . . . . . Q .
. . Q . . . . . . . . .
```
可以看到,程序成功求解了所有的十二皇后问题的解,其中前4个皇后位置随机,后8个皇后位置使用回溯算法求解。
阅读全文