(回溯算法)商人怎样安全过河

本文通过一个经典的商人过河问题,介绍了如何运用回溯算法找到解决方案。文章详细阐述了问题分析、安全状态判断、乘船方案、回溯算法的步骤,并提供了完整的C++代码实现。通过深度优先搜索,不断尝试各种可能的乘船组合,直至找到所有安全的过河路径。
(回溯算法)商人怎样安全过河

(本文属原创,转载请注名作者!author:wcnpepyu)

过河问题:

有三个商人和三个仆人过河,只有一条能装下两个人的船,在河的任何一岸上,如果仆人的人数大于商人的人数,那么该岸上的商人就会有危险。你能不能找出一种安全的渡河方法呢?

过河问题是一个比较出名的问题,借解这个问题的同时,我们来讲讲回溯算法.
首先,我们来分析下问题,商人们要过河,无非就是实现从全部未过河的状态到全部过河的状态.那么,问题可以转变为这样:
左岸:商人3,仆人3=>右岸:商人3,仆人3.即要通过一定的步骤实现状态的转变。而每一个状态(每次都是指船到岸,并不包含船在水中央时的情况)包含有如下几个因素:
1.左岸商人数;
2.左岸仆人数;
3.船在哪岸,即轮到哪岸的人上船.
至于右岸的商人数和仆人数到底是多少,我们不必再记上,因为知道了左岸的人,就可以推算出右岸的人。这样分析,问题便变为:
(3,3,1)=?=>(0,0,0).其中括号描述如下:(左岸商人数,左岸仆人数,船在左岸?1:0).

接下来分析商人有危险的状态。可设一个matrix[4][4]的布尔型数组。matrix[i][j]表示i个商人,j个仆人时是否安全的信息。判断是否安全的标准为哪岸的仆人数大于商人数,这岸的商人就会有危险(当然,哪一岸商人为0时,也是没危险的).用两重循环,可很快解决问题:
for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        {
            if(i==j||i==0||i==3);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值