此为《算法的乐趣》读书笔记,我用javascript重新实现算法。
敝人拙见
此题作者实现得过于复杂,我将初始状态定义为:[3,3,0,0,true],释义:依次表示,此岸和尚数量、此岸妖怪数量、彼岸和尚数量、彼岸妖怪数量、船在此岸否。有了以上定义,完全可以将这个题目看成与上一章桶等分水那个题目是一样的问题,两岸是两个“桶",和尚和妖怪是"水","水"在两个”桶“中回来倒,最后全部倒到彼岸那个桶中。
问题描述
有三个和尚和三个妖怪要利用唯一的一条小船过河,这条小船一次只能载两个人,同时,无论是在河的两岸还是在船上,只要妖怪的数量大于和尚的数量,妖怪们就会将和尚吃掉。现在需要选择一种过河的安排,保证和尚和妖怪都能过河且和尚不能被妖怪吃掉。
变量定义
var states = [[3,3,0,0,true]]; //初值,顺序为:本地和尚、妖怪;对岸和尚、妖怪、船在此岸
var IsLocal = true; //是否在此岸,是为真,在对岸为假
检测乘船安排是否可行(倒水方法合理?)
function CanTakeDumpAction(curr,local,from,to){
//检测船上,和尚数量大于等于妖怪或者和尚为零且总数为1或2
if((from >= to || from === 0 && to > 0) && (from + to <= 2) && (from + to > 0))