欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

过河问题,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;
}

运行截图:
过河问题,C++(非搜索算法实现)

相关标签: 题目 算法