1.问题描述:
一个农夫在河的西岸带了一匹狼、一只羊和一棵白菜,他需要把这三样东西用船带到河的东岸。然而,这艘船只能容下农夫本人和另外一样东西。如果农夫不在场的话,狼会吃掉羊,羊也会吃掉白菜。
2.问题分析:
由于整个过程涉及四个对象,多个步骤,而各个步骤中各个对象所处位置相对不同,因此可以定义一个二维数组,分别存储对象及初始状态——
initial_state[0][0],[1][0],[1][1],[1][2],[1][3],分别代表农夫,狼,羊,蔬菜,0和1分别表示所处东岸或西岸。
initial_state = [[1], [1, 1, 1, 1]]
3.算法设计:
首先,由于每下一步行动都与上一步行动后的状态有关,因此可以考虑使用递归算法。
其次注意到,为达到农夫过河最优解,即所有东西都带过河,则每一步骤应考虑最优解,亦即不存在狼吃羊,羊吃草的情况,因此可以考虑使用贪心算法。
for i in range(4): # 依次判断农夫带何种东西过河为该次最优解
state[-1][i] = 0 if state[-1][i] == 1 else 1
ret = 0
for pri in range(len(state) - 1): # 遍历过往状态,防止重复步骤
if state[-1] == state[pri]:
ret = 1
break
# 判断是否为该步骤最优解,亦即不存在狼吃羊,羊吃草的情况
if ret == 1 or state[0][0] != state[-1][2] and (state[-1][1] == state[-1][2] or state[-1][2] == state[-1][3]):
state[-1][i] = 0 if state[-1][i] == 1 else 1 # 否则回到上一步初始状