用C++编程,使用深度优先算法解决农夫过河问题
时间: 2024-05-04 20:19:29 浏览: 12
农夫过河问题可以用深度优先算法求解,具体实现如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 表示一个状态
struct State {
int f, w, g, c; // f 表示农夫,w 表示狼,g 表示羊,c 表示菜
State(int f, int w, int g, int c) : f(f), w(w), g(g), c(c) {}
};
// 判断是否是合法状态
bool is_valid_state(const State &s) {
// 农夫和动物必须在同一岸边
if ((s.f == 0 && (s.w == 1 || s.g == 1)) || (s.f == 1 && (s.w == 0 || s.g == 0))) {
return false;
}
// 羊和菜必须有一者和农夫在同一岸边
if ((s.f == 0 && (s.g == 1 && s.c == 1)) || (s.f == 1 && (s.g == 0 && s.c == 0))) {
return false;
}
return true;
}
// 判断是否达到目标状态
bool is_goal_state(const State &s) {
return s.f == 1 && s.w == 1 && s.g == 1 && s.c == 1;
}
// 深度优先搜索
bool dfs(State &s, vector<State> &path, vector<bool> &visited) {
// 如果已经达到目标状态,返回 true
if (is_goal_state(s)) {
path.push_back(s);
return true;
}
// 将当前状态加入路径
path.push_back(s);
visited[s.f * 8 + s.w * 4 + s.g * 2 + s.c] = true;
// 枚举所有可能的下一步状态
for (int i = 0; i < 4; i++) {
int nf = 1 - s.f, nw = s.w, ng = s.g, nc = s.c;
switch (i) {
case 0: nw = 1 - s.w; break;
case 1: ng = 1 - s.g; break;
case 2: nc = 1 - s.c; break;
case 3: nw = 1 - s.w; ng = 1 - s.g; break;
default: break;
}
State next(nf, nw, ng, nc);
if (!visited[next.f * 8 + next.w * 4 + next.g * 2 + next.c] && is_valid_state(next)) {
if (dfs(next, path, visited)) {
return true;
}
}
}
// 如果搜索失败,将当前状态从路径中删除
path.pop_back();
return false;
}
int main() {
State start(0, 0, 0, 0);
vector<State> path;
vector<bool> visited(16, false);
dfs(start, path, visited);
for (const auto &state : path) {
cout << "农夫 " << (state.f == 0 ? "在起点" : "在终点") << ",";
cout << (state.w == 0 ? "狼" : "狼回来了") << ",";
cout << (state.g == 0 ? "羊" : "羊回来了") << ",";
cout << (state.c == 0 ? "菜" : "菜回来了") << "。" << endl;
}
return 0;
}
```
以上代码实现了农夫过河问题的求解,输出了农夫和动物们的行动路径。