(本文属原创,转载请注名作者!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);