python讨论qq群:996113038


导语

羊狼过河问题是一个非常有趣的小学奥数题。

简单介绍一下这个问题:

一个商人,带了一匹狼,一只羊,一筐菜。来到了一条大河边。现在商人只有一条船,而且每次只能带一样东西往返大河两岸。

在商人不在的时候,狼会吃掉羊,羊会吃掉菜。如何才能让这三件东西完好无损的到达河对岸。


代码及相关资源获取

1:关注“python趣味爱好者”公众号,回复“羊狼过河 ”获取源代吗

2:加入群聊:996113038。在群文件中下载源代码以及相关资料。


开发工具

python3.6.4

相关第三方库:

pandas

numpy


基本原理

我们将羊,狼,菜过河问题简化成一个数学问题。我们先用数学语言表述一下这个问题。

我们设定一个有四个元素的列表表示狼,羊,菜,商人的状态。

initial_state = [0, 0, 0, 0]

这个元素对应的状态为0时,代表这个元素在此岸,反之在彼岸。

我们需要做的就是讲这个状态由[0,0,0,0]变成[1,1,1,1]、也就是让所有的元素全部过河。

但是为了避免狼吃掉羊,羊吃掉菜。我们对可行的中间状态还要做一定的设置。然后用枚举法的方式列举出来。知道有一个方案能成功让[0,0,0,0]变成[1,1,1,1]为止。

效果演示:下面是计算结果

我解释一下这个计算结果的意思。

第零步:农夫,羊,狼,菜全部在此岸。

第一步:农夫带着“羊(lamb)过河”。

第二步:农夫自己返回此岸

第三步:农夫带着狼(wolf)过河

第四步:农夫带着羊回到此岸。

第五步:农夫带着菜到彼岸

第六步:农夫返回

第七步:农夫带着羊过河。


往期精选

python模仿竹笛演奏《女儿情》

python制作“电子钢琴”


部分代码

下面我解释一下下面的代码。

initial_state = [0, 0, 0, 0]  # the left side of river = 0
final_state = pd.Series([1, 1, 1, 1])

‍首先我们设置初始状态和最终要达到的状态。也就是有[0,0,0,0]到达[1,1,1,1]。

然后定义一个farmer功能,在这个功能中,我们设置一下另一个变量,也就是当前状态。也就是在渡河过程中的中间状态。在迭代过程中,我们还要计算一下当前状态是否等于最终状态,如果相等,代表四个元素全部渡河成功。

  if (current == final_state).all():
        return state

另外我们要设置一下限制条件,也就是每一次渡河时,必须有商人划船。已经不让羊狼独处,不能让羊菜独处。

        row = current[current == current['farmer']]
        for id in range(num, len(row) - 1):
            current = state.loc[len(state) - 1][state_col]
            current['farmer'] = 1 - current['farmer']
            current[row.index[id]] = 1 - current[row.index[id]]


            if not (((current['wolf'] == current['lamb']) and (current['lamb'] != current['farmer'])) or \
                    ((current['lamb'] == current['veg']) and (current['lamb'] != current['farmer']))):

详细代码请大家下载以后仔细了解。

感谢大家观看,有钱的老板可以打赏一下小编哦!

扫描下方二维码,关注公众号

参考来源:

https://blog.csdn/sinat_32682001/article/details/90039380?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

作者:齐

更多推荐

趣味python编程题(一)羊,狼,菜过河。