摘要:問題描述有三個和尚和三個妖怪要利用唯一的一條小船過河,這條小船一次只能載兩個人,同時,無論是在河的兩岸還是在船上,只要妖怪的數量大于和尚的數量,妖怪們就會將和尚吃掉。現在需要選擇一種過河的安排,保證和尚和妖怪都能過河且和尚不能被妖怪吃掉。
此為《算法的樂趣》讀書筆記,我用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)){ if(local){ //此岸與彼岸是不同的 //船過岸后,兩岸都要滿足要么和尚為0,要么和尚數量大于等于妖怪 if((curr[0] >= from && curr[1] >= to && (curr[0] - from == 0 || curr[0] - from >= curr[1] - to)) && (curr[2] + from == 0 || curr[2] + from >= curr[3] + to)){ return true; } }else{ if((curr[2] >= from && curr[3] >= to && (curr[2] - from == 0 || curr[2] - from >= curr[3] - to)) && (curr[0] + from == 0 || curr[0] + from >= curr[1] + to)){ return true; } } } return false; }船到岸后(過河)操作(倒水)
function DumpWater(curr,local,from,to){ var next = curr.slice(); if(local){ //此岸與彼岸有不同的操作 next[0] -= from; next[1] -= to; next[2] += from; next[3] += to; }else{ next[0] += from; next[1] += to; next[2] -= from; next[3] -= to; } next[4] = !local //船到對岸 return next; }檢測狀態是否出現過
這個函數是保證不會進入死循環。
function IsStateExist(state){ for(var i = 0; i < states.length; i++){ if(state[0] == states[i][0] && state[1] == states[i][1] && state[2] == states[i][2] && state[3] == states[i][3] && state[4] == states[i][4]){ return true; } } return false; }狀態搜索主函數
(function SearchState(states,local){ var curr = states[states.length - 1]; //取初始狀態 if(curr[2] == 3 && curr[3] == 3){ //找到解 var rs = "" states.forEach(function(al){ rs += al.join(",") + " -> "; }); console.log(rs.substr(0,rs.length - 4)) } for(var i = 0; i < 3; i++){ //i表示乘船的和尚數量,0~2 for(var j = 0; j < 3; j++){ //j表示乘船的妖怪數量,0~2 if(CanTakeDumpAction(curr,local,i,j)){ //乘船安排合理 var next = DumpWater(curr,local,i,j); //過河 if(!IsStateExist(next)){ states.push(next); SearchState(states,!local); states.pop(); } } } } })(states,IsLocal);四組結果
3,3,0,0,true -> 3,1,0,2,false -> 3,2,0,1,true -> 3,0,0,3,false -> 3,1,0,2,true -> 1,1,2,2,false -> 2,2,1,1,true -> 0,2,3,1,false -> 0,3,3,0,true -> 0,1,3,2,false -> 0,2,3,1,true -> 0,0,3,3,false 3,3,0,0,true -> 3,1,0,2,false -> 3,2,0,1,true -> 3,0,0,3,false -> 3,1,0,2,true -> 1,1,2,2,false -> 2,2,1,1,true -> 0,2,3,1,false -> 0,3,3,0,true -> 0,1,3,2,false -> 1,1,2,2,true -> 0,0,3,3,false 3,3,0,0,true -> 2,2,1,1,false -> 3,2,0,1,true -> 3,0,0,3,false -> 3,1,0,2,true -> 1,1,2,2,false -> 2,2,1,1,true -> 0,2,3,1,false -> 0,3,3,0,true -> 0,1,3,2,false -> 0,2,3,1,true -> 0,0,3,3,false 3,3,0,0,true -> 2,2,1,1,false -> 3,2,0,1,true -> 3,0,0,3,false -> 3,1,0,2,true -> 1,1,2,2,false -> 2,2,1,1,true -> 0,2,3,1,false -> 0,3,3,0,true -> 0,1,3,2,false -> 1,1,2,2,true -> 0,0,3,3,false
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79180.html
摘要:不斷地窮舉下一步的可能性,直到最終達成目標。表示船在左邊表示船在右邊打印答案妖怪過河數僧人過河數船上是否安全左岸是否安全右岸是否安全過河后的數據過河后的數據簡單地看下深度優先搜索的函數,每次根據船所在的位置,枚舉下個狀態值。 無意中看到這么一道題,覺得很有意思,題目如下: 有三個和尚和三個妖怪要利用唯一的一條小船過河,這條小船一次只能載兩個人,同時,無論是在河的兩岸還是在船上,只要妖怪...
摘要:本文由云社區發表在一線做了十年的開發,經歷了網易百度騰訊研究院等幾個地方,陸續做過游戲頁游瀏覽器移動端翻譯等。四既要有攻城之力,也要有熬戰之氣產品開發完成后,必然有。功能開發完成后,就要開始守城了。 本文由云+社區發表 在一線做了十年的開發,經歷了網易、百度、騰訊研究院、MIG 等幾個地方,陸續做過 3D 游戲、2D 頁游、瀏覽器、移動端翻譯 app 等。 積累了一些感悟。必然有依然幼...
摘要:而眾所周知,馬是要走日子格的。輸出格式輸出有一行,一個數表示走法數。那為了防止爆掉,我們每加完一條路的總步數之后就取一遍余。題目解法思路如上述,但是這里有一個我之前從來沒有注意過的問題,導致我一直只有分。三題解四題目鏈接過河馬 ...
摘要:嗨,我是積極廢人,我是摩卡先生,現在是一所二流學院的大二學生。我不反感他,因為他說的沒錯,我就是個菜鳥啊。一個徹頭徹尾的菜鳥。保持對成功的渴望,繼續當自己的傻瓜我是摩卡先生,謝謝你的閱讀,期待我后續的文章吧 showImg(https://segmentfault.com/img/bVbbjDc); 人們總是一邊不相信雞湯,一邊又奢望雞湯在關鍵時刻能夠拉自己一把。事先說明,這是一碗有...
摘要:嗨,我是積極廢人,我是摩卡先生,現在是一所二流學院的大二學生。我不反感他,因為他說的沒錯,我就是個菜鳥啊。一個徹頭徹尾的菜鳥。保持對成功的渴望,繼續當自己的傻瓜我是摩卡先生,謝謝你的閱讀,期待我后續的文章吧 showImg(https://segmentfault.com/img/bVbbjDc); 人們總是一邊不相信雞湯,一邊又奢望雞湯在關鍵時刻能夠拉自己一把。事先說明,這是一碗有...
閱讀 2241·2023-04-26 01:50
閱讀 706·2021-09-22 15:20
閱讀 2579·2019-08-30 15:53
閱讀 1585·2019-08-30 12:49
閱讀 1704·2019-08-26 14:05
閱讀 2700·2019-08-26 11:42
閱讀 2298·2019-08-26 10:40
閱讀 2587·2019-08-26 10:38