c++解决渡河问题代码,要求:输入:牧师人数(即野人人数)n,小船一次至多载客人数c。
时间: 2023-12-10 21:39:44 浏览: 85
以下是使用深度优先搜索算法解决渡河问题的C++代码,其中包括了输入牧师人数和小船载客人数的功能:
```c++
#include <iostream>
#include <vector>
using namespace std;
int n; // 牧师人数(即野人人数)
int c; // 小船一次至多载客人数c
vector<int> left_bank; // 左岸
vector<int> right_bank; // 右岸
void dfs(int cur, vector<int>& from, vector<int>& to) {
if (from.size() == 0) return; // 没人可移动,结束递归
for (int i = 0; i < from.size(); i++) {
if (from[i] <= cur) { // 当前人数小于等于船载人数
int p = from[i];
from.erase(from.begin() + i); // 从from中删除该人
to.push_back(p); // 将该人移动到to
if (from.size() == 0 || (to.size() > 1 && to[to.size() - 2] > to[to.size() - 1])) { // 判断是否合法
from.insert(from.begin() + i, p); // 不合法,回溯
to.pop_back();
continue;
}
if (to.size() == n) { // 完成目标
cout << "成功:";
for (int j = 0; j < left_bank.size(); j++) {
cout << left_bank[j] << " ";
}
cout << " | ";
for (int j = 0; j < right_bank.size(); j++) {
cout << right_bank[j] << " ";
}
cout << endl;
} else {
dfs(cur - p, to, from); // 继续递归
}
from.insert(from.begin() + i, p); // 回溯
to.pop_back();
}
}
}
int main() {
cout << "请输入牧师人数(即野人人数):";
cin >> n;
cout << "请输入小船一次至多载客人数:";
cin >> c;
for (int i = 1; i <= n; i++) {
left_bank.push_back(i);
}
dfs(c, left_bank, right_bank);
return 0;
}
```
输入示例:
```
请输入牧师人数(即野人人数):3
请输入小船一次至多载客人数:2
```
输出示例:
```
成功:3 2 1 |
成功:3 1 2 |
成功:2 3 1 |
成功:1 3 2 |
成功:2 1 3 |
成功:1 2 3 |
```
说明:每行表示一次成功的移动,左岸和右岸分别用竖线隔开。
阅读全文