摘要:?jiǎn)栴}描述有三個(gè)和尚和三個(gè)妖怪要利用唯一的一條小船過(guò)河,這條小船一次只能載兩個(gè)人,同時(shí),無(wú)論是在河的兩岸還是在船上,只要妖怪的數(shù)量大于和尚的數(shù)量,妖怪們就會(huì)將和尚吃掉?,F(xiàn)在需要選擇一種過(guò)河的安排,保證和尚和妖怪都能過(guò)河且和尚不能被妖怪吃掉。
此為《算法的樂(lè)趣》讀書(shū)筆記,我用javascript重新實(shí)現(xiàn)算法。
敝人拙見(jiàn)此題作者實(shí)現(xiàn)得過(guò)于復(fù)雜,我將初始狀態(tài)定義為:[3,3,0,0,true],釋義:依次表示,此岸和尚數(shù)量、此岸妖怪?jǐn)?shù)量、彼岸和尚數(shù)量、彼岸妖怪?jǐn)?shù)量、船在此岸否。有了以上定義,完全可以將這個(gè)題目看成與上一章桶等分水那個(gè)題目是一樣的問(wèn)題,兩岸是兩個(gè)“桶",和尚和妖怪是"水","水"在兩個(gè)”桶“中回來(lái)倒,最后全部倒到彼岸那個(gè)桶中。
問(wèn)題描述變量定義有三個(gè)和尚和三個(gè)妖怪要利用唯一的一條小船過(guò)河,這條小船一次只能載兩個(gè)人,同時(shí),無(wú)論是在河的兩岸還是在船上,只要妖怪的數(shù)量大于和尚的數(shù)量,妖怪們就會(huì)將和尚吃掉。現(xiàn)在需要選擇一種過(guò)河的安排,保證和尚和妖怪都能過(guò)河且和尚不能被妖怪吃掉。
var states = [[3,3,0,0,true]]; //初值,順序?yàn)椋罕镜睾蜕?、妖?對(duì)岸和尚、妖怪、船在此岸 var IsLocal = true; //是否在此岸,是為真,在對(duì)岸為假檢測(cè)乘船安排是否可行(倒水方法合理?)
function CanTakeDumpAction(curr,local,from,to){ //檢測(cè)船上,和尚數(shù)量大于等于妖怪或者和尚為零且總數(shù)為1或2 if((from >= to || from === 0 && to > 0) && (from + to <= 2) && (from + to > 0)){ if(local){ //此岸與彼岸是不同的 //船過(guò)岸后,兩岸都要滿足要么和尚為0,要么和尚數(shù)量大于等于妖怪 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; }船到岸后(過(guò)河)操作(倒水)
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 //船到對(duì)岸 return next; }檢測(cè)狀態(tài)是否出現(xiàn)過(guò)
這個(gè)函數(shù)是保證不會(huì)進(jìn)入死循環(huán)。
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; }狀態(tài)搜索主函數(shù)
(function SearchState(states,local){ var curr = states[states.length - 1]; //取初始狀態(tài) 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表示乘船的和尚數(shù)量,0~2 for(var j = 0; j < 3; j++){ //j表示乘船的妖怪?jǐn)?shù)量,0~2 if(CanTakeDumpAction(curr,local,i,j)){ //乘船安排合理 var next = DumpWater(curr,local,i,j); //過(guò)河 if(!IsStateExist(next)){ states.push(next); SearchState(states,!local); states.pop(); } } } } })(states,IsLocal);四組結(jié)果
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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/79180.html
摘要:不斷地窮舉下一步的可能性,直到最終達(dá)成目標(biāo)。表示船在左邊表示船在右邊打印答案妖怪過(guò)河數(shù)僧人過(guò)河數(shù)船上是否安全左岸是否安全右岸是否安全過(guò)河后的數(shù)據(jù)過(guò)河后的數(shù)據(jù)簡(jiǎn)單地看下深度優(yōu)先搜索的函數(shù),每次根據(jù)船所在的位置,枚舉下個(gè)狀態(tài)值。 無(wú)意中看到這么一道題,覺(jué)得很有意思,題目如下: 有三個(gè)和尚和三個(gè)妖怪要利用唯一的一條小船過(guò)河,這條小船一次只能載兩個(gè)人,同時(shí),無(wú)論是在河的兩岸還是在船上,只要妖怪...
摘要:本文由云社區(qū)發(fā)表在一線做了十年的開(kāi)發(fā),經(jīng)歷了網(wǎng)易百度騰訊研究院等幾個(gè)地方,陸續(xù)做過(guò)游戲頁(yè)游瀏覽器移動(dòng)端翻譯等。四既要有攻城之力,也要有熬戰(zhàn)之氣產(chǎn)品開(kāi)發(fā)完成后,必然有。功能開(kāi)發(fā)完成后,就要開(kāi)始守城了。 本文由云+社區(qū)發(fā)表 在一線做了十年的開(kāi)發(fā),經(jīng)歷了網(wǎng)易、百度、騰訊研究院、MIG 等幾個(gè)地方,陸續(xù)做過(guò) 3D 游戲、2D 頁(yè)游、瀏覽器、移動(dòng)端翻譯 app 等。 積累了一些感悟。必然有依然幼...
摘要:而眾所周知,馬是要走日子格的。輸出格式輸出有一行,一個(gè)數(shù)表示走法數(shù)。那為了防止爆掉,我們每加完一條路的總步數(shù)之后就取一遍余。題目解法思路如上述,但是這里有一個(gè)我之前從來(lái)沒(méi)有注意過(guò)的問(wèn)題,導(dǎo)致我一直只有分。三題解四題目鏈接過(guò)河馬 ...
摘要:嗨,我是積極廢人,我是摩卡先生,現(xiàn)在是一所二流學(xué)院的大二學(xué)生。我不反感他,因?yàn)樗f(shuō)的沒(méi)錯(cuò),我就是個(gè)菜鳥(niǎo)啊。一個(gè)徹頭徹尾的菜鳥(niǎo)。保持對(duì)成功的渴望,繼續(xù)當(dāng)自己的傻瓜我是摩卡先生,謝謝你的閱讀,期待我后續(xù)的文章吧 showImg(https://segmentfault.com/img/bVbbjDc); 人們總是一邊不相信雞湯,一邊又奢望雞湯在關(guān)鍵時(shí)刻能夠拉自己一把。事先說(shuō)明,這是一碗有...
摘要:嗨,我是積極廢人,我是摩卡先生,現(xiàn)在是一所二流學(xué)院的大二學(xué)生。我不反感他,因?yàn)樗f(shuō)的沒(méi)錯(cuò),我就是個(gè)菜鳥(niǎo)啊。一個(gè)徹頭徹尾的菜鳥(niǎo)。保持對(duì)成功的渴望,繼續(xù)當(dāng)自己的傻瓜我是摩卡先生,謝謝你的閱讀,期待我后續(xù)的文章吧 showImg(https://segmentfault.com/img/bVbbjDc); 人們總是一邊不相信雞湯,一邊又奢望雞湯在關(guān)鍵時(shí)刻能夠拉自己一把。事先說(shuō)明,這是一碗有...
閱讀 2332·2023-04-26 01:50
閱讀 765·2021-09-22 15:20
閱讀 2667·2019-08-30 15:53
閱讀 1659·2019-08-30 12:49
閱讀 1764·2019-08-26 14:05
閱讀 2782·2019-08-26 11:42
閱讀 2396·2019-08-26 10:40
閱讀 2667·2019-08-26 10:38