过河问题,C++(非搜索算法实现)
程序员文章站
2022-07-14 14:14:09
...
问题描述:农夫带着狼, 羊, 白菜过河,如果农夫没有在旁边看着它们, 狼就会吃羊, 羊会吃白菜,
但是小船一次只能载一人一物。
主要过程:
- 判断农夫状态 -> 决定去右岸还是回左岸
- 去右岸 -> 带哪一件物品(先判断这件物品是不是我刚带回来的!)
带哪一件物品 -> 模拟带走以后,会不会相互伤害 -> 不相互伤害则带走(相互伤害则跳过) - 回左岸 -> 若独自一人回去后不出现相互伤害,则独自一人回 (若相互伤害则带走一件物品)
- 每过一次河,判断是否运完了!!
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
//bool变量 farmer和数组article[3] 表示农夫和他的狼、羊、白菜的在河的左边还是右边,true为左岸,false为右岸
bool farmer = true;
bool article[3] = { true,true,true };
//string数组,表示数组article中三个变量对应的名称
string name[3] = {"灰太狼","懒羊羊","大白菜"};
//记录农夫本次开船载的物品是什么(编号),第一次没有载过,初始化为3,不在数组编号中!
int temp = 3;
cout << "--------------下面模拟过程开始--------------" << endl;
//一直载循环渡河中,直至所有物品都载到了河的右岸
//其中每次循环,通过判断农夫的状态,确定这次行为是 过河的右岸,还是 回河的左岸
while (true)
{
//农夫状态为true,在左岸,则本次行为是 过河的右岸,循环判断3件物品,确定载哪一件物品过河
if (farmer == true) {
for (int i = 0; i < 3; i++) {
//判断这次是不是和农夫带过来的物品(编号)是否一样,如果一样则跳过此次循环,避免做无用功
if (i == temp)
continue;
//只有该件物品在河的左岸,才开始判断,否则让他直接跳过循环
if (article[i] == true) {
//先假设本次将这件物品载到了河的右岸,即置为false
//并且判断载过去后,会不会出现自相残杀的情况
article[i] = false;
//若载过去后,(河的左岸!!因为河的右岸就算出现了,农夫也在那里盯着,并不会真的出现!)出现了自相残杀的情况,则还原之间的状态,并跳过此次循环
if ((article[0] == article[1] || article[1] == article[2]) && article[1] == true) {
article[i] = true;
continue;
}
//若没有出现自相残杀,则就载这件物品过河,并将农夫状态置为false,记录载过去的物品编号,跳出这个for循环
else {
farmer = false;
temp = i;
cout << "农夫开着船,带着" << name[i] << "过河了,即" << name[i] << "->" << endl;
break;
}
}
}
}
//回河的左岸,需要判断农夫回岸的左边后,物品是否会自相残杀
else if (farmer == false) {
//(因为优先农夫独自一人回左岸,直接判断右岸的情况),农夫回岸的左边后,(河的右岸)物品会自相残杀
if ((article[0] == article[1] || article[1] == article[2]) && article[1] == false) {
//若会自相残杀,则循环判断载一件物品回河的左岸
for (int i = 0; i < 3; i++) {
//这里和上面过河的右岸,情况类似,就不写太多注释了
if (i == temp)
continue;
if (article[i] == false) {
article[i] = true;
if ((article[0] == article[1] || article[1] == article[2]) && article[1] == false) {
article[i] = false;
continue;
}
else {
farmer = true;
temp = i;
cout << "农夫开着船,带着" << name[i] << "回河的左岸了,即" << name[i] << "<-" << endl;
break;
}
}
}
}
//若不会自相残杀,则独自一人回河的左岸
else {
farmer = true;
temp = 3;
cout << "农夫独自一人开船回来了" << endl;
}
}
//农夫每次行为做完后,判断是否完成了过河任务,若完成,则跳出while循环
if (article[0] == article[1] && article[1] == article[2] && article[0] == false) {
cout << "此刻,狼,羊,白菜都已经在河的右岸了,过河问题已经解决。" << endl;
break;
}
}
cout << "---------------模拟过程已结束---------------" << endl;
return 0;
}
运行截图: