使用拉斯维加斯算法求解八后问题,并用c++编程实现;随机放置0-8个后,每种情况至少运行100次,并统计成功求出解的概率(记为p),成功求出解时需要访问的结点数的平均值(记为s),未能成功求出解时需要访问的结点数的平均值(记为f)
时间: 2024-02-16 21:01:18 浏览: 82
好的,以下是使用 C++ 编程实现的代码,它可以使用拉斯维加斯算法求解八后问题,并统计不同放置情况下的成功求解概率、成功求解时访问的结点数平均值以及未能成功求解时访问的结点数平均值:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
using namespace std;
// 检查当前放置方案是否合法
bool conflict(const vector<int>& state, int nextX)
{
int nextY = state.size();
for (int i = 0; i < nextY; i++)
{
if (abs(state[i] - nextX) == 0 || abs(state[i] - nextX) == nextY - i)
{
return true;
}
}
return false;
}
// 求解八后问题的基础函数
void queens(int num, vector<int>& state, vector<vector<int>>& results)
{
for (int pos = 0; pos < num; pos++)
{
if (!conflict(state, pos))
{
if (state.size() == num - 1)
{
state.push_back(pos);
results.push_back(state);
state.pop_back();
}
else
{
state.push_back(pos);
queens(num, state, results);
state.pop_back();
}
}
}
}
// 使用拉斯维加斯算法求解八后问题
void las_vegas_queens(int num = 8)
{
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(0, num-1);
int tries = 0;
int successes = 0;
int visited_nodes_s = 0;
int visited_nodes_f = 0;
for (int i = 0; i < 100; i++)
{
vector<int> state;
int visited_nodes = 0;
// 随机放置皇后,最多放置 num 个
for (int j = 0; j < dis(gen); j++)
{
state.push_back(dis(gen));
}
// 求解
while (true)
{
visited_nodes++;
vector<vector<int>> results;
queens(num, state, results);
if (!results.empty())
{
successes++;
visited_nodes_s += visited_nodes;
break;
}
else
{
tries++;
visited_nodes_f += visited_nodes;
break;
}
}
}
double p = successes / 100.0;
double s = visited_nodes_s / static_cast<double>(successes);
double f = visited_nodes_f / static_cast<double>(100-successes);
cout << "成功求解概率:" << p << endl;
cout << "成功求解时访问的结点数平均值:" << s << endl;
cout << "未能成功求解时访问的结点数平均值:" << f << endl;
}
int main()
{
las_vegas_queens(8);
return 0;
}
```
这段代码中,`conflict()`函数用来检查当前放置方案是否合法。`queens()`函数是用来求解八后问题的基础函数,它使用回溯法递归地求解所有合法的放置方案,并将它们存储在`results`向量中。`las_vegas_queens()`函数则是使用拉斯维加斯算法求解八后问题的具体实现,它使用`queens()`函数来求解,直到找到一组合法的放置方案为止。在`las_vegas_queens()`函数中,我们进行了 100 次随机放置和求解,统计成功求解的概率以及成功求解时和未能成功求解时访问的结点数的平均值。
您可以通过调用`las_vegas_queens()`函数来进行测试。
阅读全文