商人过河问题

本文介绍了一个基于栈的算法,用于解决船过河问题,通过判断操作的可行性并标记已存在状态,找到从起始状态到结束状态的可行路径。算法包括主函数、passable函数和solver函数,计算并记录商人数和仆人数。
摘要由CSDN通过智能技术生成
test=[[True,True,True,True],##### 状态允许,作为检验下一步的依据
      [True,True,False,False],
      [True,True,True,False],
      [True,True,True,True]]
###有效的操作
dirs=[[1,1],[0,2],[0,1],[1,0],[2,0]]

start=[3,3,1]###开始状态
end=[0,0,0]###结束状态

list2=[start]
###mark函数用于标记已经存在的状态,如果这个状态可行,加入list2中。
def mark(nextp):
    list2.append(nextp)
    return True
#######判断解的可行性,如果可行,加入栈中
def passable(nextp):
    k=[]
    a=[3-nextp[0],3-nextp[1]]
    for i in a:
        if i<0 or i>3:
            return False
    if test[a[0]][a[1]] and test[nextp[0]][nextp[1]]:
        if nextp not in list2:
            return True
        else:
            return False
            
#####主函数   
def solver(start,end):
    if start==end:
        print(start)
        return
    stack=[] #建立栈
    stack.append((start)) #放入初始状态
    while stack:
        n=len(stack)
        #nxt 记录记录方向
        pos=stack.pop()
        ####   5表示操作数
        for i in range(5):
            '''计算下一步,n是栈的长度,n为奇数,表示过河,n为偶数,表示将船返回'''
            nextp=[pos[0]+pow(-1,n)*dirs[i][0],pos[1]+pow(-1,n)*dirs[i][1],(n+1)%2]
            ####搜索结束的条件
            if nextp==end:
                stack.append((nextp))
                print('问题解决')
                return stack
            ####判断解是否可行
            if passable(nextp):
                ###如果可行,将原状态先放入栈中,并将 方向+1
                stack.append((pos))
                ###标记解,防止无限循环
                mark(nextp)
                ###将下一状态放入栈中
                stack.append((nextp))
                ###结束循环
                break
            
st=solver(start,end)
for i in st:
    print('左岸商人数: %d'%i[0],'左岸仆人数: %d'%i[1])
print('全部过河,共%d步'%len(st))

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
商人过河问题是一个经典的逻辑问题,其解法可以通过多步决策来实现安全渡河。在这个问题中,有三名商人和他们各自的随从需要渡河,船只只能容纳两人。当随从人数比商人多时,随从就会杀人越货,乘船权在商人手中。那么商人应该如何安全渡河呢? 可以使用以下步骤来解决商人过河问题: 1. 将船停在起始岸边,让商人A和商人B上船,然后商人A将船划到目标岸边。 2. 商人A下船,让商人B继续留在目标岸边,商人A将船划回起始岸边。 3. 商人A将随从A带上船,然后将船划到目标岸边。 4. 商人A下船,商人B上船,商人B将船划回起始岸边。 5. 商人B将随从B带上船,然后将船划到目标岸边。 6. 商人B下船,商人A上船,商人A将船划回起始岸边。 7. 商人A和商人B一起上船,将船划到目标岸边。 8. 商人A下船,商人B继续留在目标岸边,商人A将船划回起始岸边。 9. 商人A将随从A带上船,然后将船划到目标岸边。 10. 商人A下船,商人B上船,商人B将船划回起始岸边。 11. 商人B将随从B带上船,然后将船划到目标岸边。 12. 商人B下船,商人A上船,商人A将船划回起始岸边。 13. 商人A和商人B一起上船,将船划到目标岸边。 通过以上步骤,商人和随从可以安全地渡过河流。需要注意的是,在每一步决策中,都要确保两岸的随从人数都不会超过商人人数,以保证安全。这个问题也可以使用MATLAB程序进行求解,通过一个while循环实现n个商人和n个随从情况下的最优解(步骤最少)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [商人过河问题](https://download.csdn.net/download/qq_42235496/10422314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [数学模型-商人过河问题](https://download.csdn.net/download/tosiya/87350340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [商人过河问题MATLAB程序](https://download.csdn.net/download/kwzzarcher/11422851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值