C++代码用概率算法解决八皇后问题
时间: 2023-10-30 21:15:56 浏览: 50
以下是一种用概率算法解决八皇后问题的C++代码:
```c++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
const int N = 8; // 皇后个数
int col[N]; // 列
int w[2 * N - 1]; // 主对角线
int e[2 * N - 1]; // 副对角线
// 判断是否能在第row行第col列放置皇后
bool check(int row, int col) {
return !col[row] && !w[row - col + N - 1] && !e[row + col];
}
// 随机放置皇后
void place(int row) {
if (row == N) return; // 找到了解
int cnt = 0;
int pos[N]; // 可以放置的列的位置
for (int i = 0; i < N; i++) {
if (check(row, i)) {
pos[cnt++] = i;
}
}
if (cnt == 0) return; // 没有可行的位置
int x = rand() % cnt; // 随机选择一个位置
col[row] = pos[x];
w[row - col[row] + N - 1] = 1;
e[row + col[row]] = 1;
place(row + 1); // 递归放置下一行的皇后
}
// 打印结果
void print() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (col[i] == j) {
cout << "Q ";
} else {
cout << ". ";
}
}
cout << endl;
}
cout << endl;
}
int main() {
srand(time(nullptr));
int count = 0; // 解的个数
for (int i = 0; i < 1000000; i++) { // 进行100万次随机尝试
for (int j = 0; j < N; j++) {
col[j] = w[j] = e[j] = 0;
}
place(0);
if (col[0] != -1) { // 找到了解
count++;
cout << "Solution " << count << ":" << endl;
print();
}
}
cout << "Total solutions: " << count << endl;
return 0;
}
```
该算法会进行100万次随机尝试,尝试次数可以根据实际情况进行调整。每次尝试时,先随机放置第一行的皇后,然后递归地放置下一行的皇后。在放置皇后时,先找出可以放置的列的位置,然后随机选择一个位置放置。如果找不到可行的位置,则回溯到上一行重新放置皇后。最后,统计解的个数并输出每个解的棋盘布局。