概率算法法求解八皇后问题c语言代码
时间: 2023-07-31 17:10:01 浏览: 97
八皇后问题可以使用概率算法来解决。以下是一个基于概率算法的八皇后问题的C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 8
int main()
{
int queens[N]; // 皇后位置数组
int conflicts[N][N]; // 冲突数数组
int i, j, k, m, n, min_conflicts, conflict_count, col;
srand(time(NULL)); // 随机数种子
// 初始化皇后位置数组,将每个皇后放在不同的列中
for (i = 0; i < N; i++) {
queens[i] = i;
}
// 迭代求解
for (k = 0; k < 100; k++) { // 迭代100次
for (i = 0; i < N; i++) { // 计算冲突数
for (j = 0; j < N; j++) {
conflicts[i][j] = 0;
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i != j) {
if (queens[i] == queens[j] || abs(queens[i] - queens[j]) == abs(i - j)) {
conflicts[i][j] = 1;
}
}
}
}
min_conflicts = N;
for (i = 0; i < N; i++) { // 找到冲突最少的皇后
conflict_count = 0;
for (j = 0; j < N; j++) {
conflict_count += conflicts[i][j];
}
if (conflict_count < min_conflicts) {
min_conflicts = conflict_count;
col = i;
}
}
if (min_conflicts == 0) { // 找到解
break;
}
// 随机移动皇后到冲突最少的位置
m = 0;
n = 0;
for (i = 0; i < N; i++) {
if (conflicts[col][i] == 1) {
m++;
}
}
n = rand() % m + 1;
for (i = 0; i < N; i++) {
if (conflicts[col][i] == 1) {
n--;
if (n == 0) {
queens[col] = i;
break;
}
}
}
}
if (k == 100) {
printf("Failed!\n"); // 未找到解
} else {
printf("Solution:\n");
for (i = 0; i < N; i++) { // 输出解
for (j = 0; j < N; j++) {
if (j == queens[i]) {
printf("Q ");
} else {
printf(". ");
}
}
printf("\n");
}
}
return 0;
}
```
该代码使用了迭代求解的方法,迭代100次,每次找到冲突最少的皇后,随机移动到冲突最少的位置。如果迭代100次未找到解,则认为未找到解。
阅读全文