无关前言
进入大学一年半了,发现许多不久前学过的知识转头就会忘并且自己的学习能力也没那么尽如人意,在知道了程序员的神器小黄鸭后,想着也许把我所学到的知识讲清楚分享出来更有利于自己的深度理解,同时也能帮到他人避开我所走的弯路。来到这个平台的目的就是分享自己的所学所感并与他人交流,大家共同进步。如果大家发现了我的问题(其实我挺菜的),请在评论区畅所欲言!
问题叙述
三名商人和他们的三个仆从打算乘船过河。小船最多容纳两人,在河的任一岸,如果仆从的数量超过商人,仆从们就会杀人越货,如何才能让商人们安全过河呢?
构建模型
首先把该问题抽象成一个简单的数学问题:我们将河左岸商人,仆从,和船所在的位置看作看作一个状态,并用一个向量(a,b,dir)加以描述:第一个分量代表左岸商人个数,第二个代表左岸仆从个数,第三个代表船所在的位置(-1为左岸,1为右岸)。接下来就是描述状态间的转移操作:我们用一个二维向量(p,q)代表船上商人和仆从的人数。那么从原状态(a,b,dir)经过操作(p,q)变为下一状态(c,d,new_dir)可以用该式表示:(c,d,new_dir)=(a,b,-dir)+dir*(p,q)。接下来我们的目标就是找到一个操作序列,使得初始状态(3,3,-1)在这个操作序列的作用下变为(0,0,1)。
模型求解

代码实现
这里有的函数名后面会有个2,这个是为了和我之前的人狗鸡米问题(同样的解决思路)的函数区别一下,不必在意
function [ out ] = move_2( i )
%返回允许操作集的第i个操作
move=[1 0;0 1;2 0;1 1;0 2];
out=move(i,:);
end
function [ flag ] = check_status_2( status )
%检验是否在允许状态中,yes:1,no:0
status_permit=[3 3 1; 3 0 1;3 1 1;3 2 1;2 2 1;0 0 1;0 3 1;0 2 1;0 1 1;1 1 1] ;
temp=status_permit;
temp(:,end)=-temp(:,end)

最低0.47元/天 解锁文章
1592





