日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

妖怪与和尚过河问题

發布時間:2024/1/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 妖怪与和尚过河问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:

有三個和尚和三個妖怪,他們要利用唯一一條小船過河,這條小船一次最多只能載兩個人,同時,無論是在河的兩岸還是船上,只要妖怪的數量大于和尚的數量,妖怪們就會將和尚吃掉。現在需要選擇一種過河的安排,保證和尚和妖怪都能過河且和尚不能被妖怪吃掉。

問題分析:

將和尚和妖怪們的狀態抽象為一個數組

$status = array('left_missionary_num',  //左岸和尚數量'left_monster_num',    //左岸妖怪數量'right_missionary_num',  //右岸和尚數量'right_monster_num'    //右岸妖怪數量 )

初始狀態為array(3,3,0,0),并且船在左岸,最終狀態是array(0,0,3,3),此時船在右岸。

船的左右移動會推動狀態的轉變,用-1表示船在左岸,用1表示船在右岸,當船靠岸時,船上的所有和尚或者妖怪要下船。

為了保證和尚不被妖怪吃掉,則需要滿足以下約束

$status['left_missionary_num'] >= $status['left_monster_num'],表示左岸和尚的數量>=左岸妖怪的數量
$status['right_missionary_num'] >= $status['right_monster_num'],表示右岸和尚的數量>=右岸妖怪的數量
3 - $status['left_missionary_num'] - $status['right_missionary_num'] >= 3 - $status['left_monster_num'] - $status['right_monster_num'],表示船上的和尚數量>=船上的妖怪數量,因為船上最多只有2個位置,所以這個條件是默認滿足的。

狀態的搜索:

每一次狀態轉變時:
上船:要根據船的位置來判斷是左岸還是右岸的和尚或妖怪上船。
下船:要根據船的位置來判斷船上的和尚或妖怪下船后會加入左岸還是右岸。

下船后,要符合上面提到的約束。

并且上船后,要保證岸邊的和尚或者妖怪的數量都要 >= 0。

每個狀態可能會有多個下一個狀態,在不考慮約束的情況下,總共會有5種可能,分別是①1個和尚上船、②2個和尚上船、③1個妖怪上船、④2個妖怪上船,⑤一個和尚與一個妖怪上船。
對上述5種可能逐一進行約束驗證,如果驗證不通過,則忽略這種可能。

避免陷入"環路":

在搜索狀態時,會遇到“狀態環路”,例如array(3,3,0,0) -> array(3,2,0,1) -> array(3,3,0,0),有一些狀態環路包含的步驟可能會更多一些。如果對這種情況不做處理,搜索就會陷入循環從而無法得出結果。

如何避免“狀態環路”:

首先定義狀態的數據結構:

$status = array('id','value','ancestor_ids','boat_status' );

$status包含4個屬性:id、value、ancestor_ids、boat_status,其中,每一個$status的id都是唯一的(id >= 0)(只有初始狀態的id = 0),value是一個數組,代表狀態的值,例如array(3,3,0,0),ancestor_ids也是一個數組,包含了(本狀態的)所有父、祖父、。。。、狀態的id,boat_status代表船的位置。

當一個狀態和它的ancestor_ids中包含的狀態中的任意一個的value和boat_status完全一致時,就可以判定這個狀態前面已經出現過了,直接忽略它就可避免“狀態環路”。

問題解答:

總共有4種不同的安排可以讓和尚和妖怪安全地過河,這4種安排所使用的步驟數目都是一樣的,都是11步。

程序設計(PHP):

1 <?php 2 echo '<p>問題描述:</p>'; 3 echo '<p>有三個和尚和三個妖怪,他們要利用唯一一條小船過河,這條小船一次最多只能載兩個人,同時,無論是在河的兩岸還是船上,只要妖怪的數量大于和尚的數量,妖怪們就會將和尚吃掉。現在需要選擇一種過河的安排,保證和尚和妖怪都能過河且和尚不能被妖怪吃掉。</p>'; 4 echo '<p>解答:</p>'; 5 echo '<p>其中,[]括號中數字的含義是:第一個代表左岸和尚的數量, 6 第二個代表左岸妖怪的數量,第三個代表右岸和尚的數量,第四個代表右岸妖怪的數量;boat status等于-1代表船在左岸,boat status等于1代表船在右岸。</p>'; 7 8 echo "<pre>"; 9 10 const left_missionary_num = 0; 11 const left_monster_num = 1; 12 const right_missionary_num = 2; 13 const right_monster_num = 3; 14 15 const boat_missionary_num = 0; 16 const boat_monster_num = 1; 17 18 $currentStatus = array( 19 left_missionary_num => 3, 20 left_monster_num => 3, 21 right_missionary_num=> 0, 22 right_monster_num => 0 23 ); 24 25 $boat = -1;//left bank 26 $statusId = 0; 27 $statuses = array( 28 0 => array( 29 'value' => $currentStatus, 30 'ancestor_ids' => array(), 31 'boat_status' => -1 32 ) 33 ); 34 35 findPath($currentStatus, $statusId, $statusId, $statuses, $boat); 36 37 echo '<p>搜索中產生的所有狀態(狀態樹):</p>'; 38 print_r($statuses); 39 40 41 42 function findPath(array $status, $id, &$statusId, &$statuses, $boat) 43 { 44 $availableBoatStatuses = array( 45 array(boat_missionary_num => 1, boat_monster_num => 0), 46 array(boat_missionary_num => 2, boat_monster_num => 0), 47 array(boat_missionary_num => 0, boat_monster_num => 1), 48 array(boat_missionary_num => 0, boat_monster_num => 2), 49 array(boat_missionary_num => 1, boat_monster_num => 1), 50 ); 51 foreach ($availableBoatStatuses as $availableBoatStatus) { 52 $nextStatus = generateNextStatus($status, $availableBoatStatus, $boat); 53 54 if($nextStatus){ 55 $_boat = -1 * $boat; 56 $ancestorIds = $statuses[$id]['ancestor_ids']; 57 $ancestorIds[] = $id; 58 59 $isAncestor = false; 60 foreach ($ancestorIds as $ancestorId) { 61 if($statuses[$ancestorId]['value'] === $nextStatus 62 && $_boat === $statuses[$ancestorId]['boat_status'] 63 ){ 64 $isAncestor = true; 65 break; 66 } 67 } 68 69 if($isAncestor){ 70 continue; //Ignore the result if $nextStatus === $statuses['$ancestorId'] 71 } 72 73 $statusId++; 74 75 $statuses[$statusId] = array( 76 'value' => $nextStatus, 77 'ancestor_ids' => $ancestorIds, 78 'boat_status' => $_boat 79 ); 80 81 if($nextStatus === array(0,0,3,3)){ 82 83 foreach ($statuses[$statusId]['ancestor_ids'] as $key => $ancestorId) { 84 //print_r($statuses[$ancestorId]['value']); 85 if($key % 5 == 0){ 86 echo '<br/>'; 87 } 88 $v = $statuses[$ancestorId]['value']; 89 printf('[%d,%d,%d,%d], boat status = %d -->', $v[0],$v[1],$v[2],$v[3],$statuses[$ancestorId]['boat_status']); 90 } 91 printf('[%d, %d, %d, %d], boat status = %d', $nextStatus[0],$nextStatus[1],$nextStatus[2],$nextStatus[3],$_boat); 92 echo '<br/>'; 93 94 printf('總共使用 %d 步完成', count($statuses[$statusId]['ancestor_ids'])); 95 echo '<hr>'; 96 }else{ 97 findPath($nextStatus, $statusId, $statusId, $statuses, $_boat); 98 } 99 } 100 } 101 } 102 103 /** 104 * @param array $status 105 * @param array $availableBoatStatus 106 * @param int $boatStatus 107 * @return array|bool 108 */ 109 function generateNextStatus(array $status, array $availableBoatStatus, $boatStatus) 110 { 111 if($boatStatus < 0){ 112 //船在左岸,上船后 113 $status[left_missionary_num] = $status[left_missionary_num] - $availableBoatStatus[boat_missionary_num]; 114 $status[left_monster_num] = $status[left_monster_num] - $availableBoatStatus[boat_monster_num]; 115 //船到右岸,下船后 116 $status[right_missionary_num] = $status[right_missionary_num] + $availableBoatStatus[boat_missionary_num]; 117 $status[right_monster_num] = $status[right_monster_num] + $availableBoatStatus[boat_monster_num]; 118 }else{ 119 //船在右岸,上船后 120 $status[right_missionary_num] = $status[right_missionary_num] - $availableBoatStatus[boat_missionary_num]; 121 $status[right_monster_num] = $status[right_monster_num] - $availableBoatStatus[boat_monster_num]; 122 //船到左岸,下船后 123 $status[left_missionary_num] = $status[left_missionary_num] + $availableBoatStatus[boat_missionary_num]; 124 $status[left_monster_num] = $status[left_monster_num] + $availableBoatStatus[boat_monster_num]; 125 } 126 127 foreach ($status as $value) { 128 if($value < 0){ 129 return false; 130 } 131 } 132 133 if(($status[left_missionary_num] >= $status[left_monster_num]) && 134 ($status[right_missionary_num] >= $status[right_monster_num]) 135 || $status[left_missionary_num] === 0 || $status[right_missionary_num] === 0){ 136 return $status; 137 } 138 139 return false; 140 }

?

轉載于:https://www.cnblogs.com/jpdoutop/p/5775911.html

總結

以上是生活随笔為你收集整理的妖怪与和尚过河问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: a级片网站 | 95香蕉视频 | 国产aaa大片 | 天堂中文网在线 | 华人永久免费 | 丝袜一区二区三区四区 | 亚洲私拍 | 亚洲视频精品一区 | 91av一区二区三区 | 黄免费在线观看 | 中文字幕一区二区三区久久久 | 亚洲精品一区二三区 | 亚洲天堂999 | 日韩电影三级 | 美女伦理水蜜桃4 | 欧美一区二区在线免费观看 | 91亚洲国产成人久久精品网站 | 51国产偷自视频区视频 | 在线观看jizz | 又黄又湿的网站 | 国产精品suv一区 | 亚洲美女在线播放 | 国产三级午夜理伦三级 | 日本二区在线观看 | 国产精品区一区二区三 | 狠狠干男人的天堂 | 免费av小说 | 国产男人天堂 | 欧美黄网在线观看 | 国产精品综合一区二区 | 九色九一| 亚洲一区二区麻豆 | 日韩在线观看一区二区 | 爆乳熟妇一区二区三区 | 成人一区二区三区视频 | 九九久久精品视频 | 一本一道久久 | 亚洲综合影院 | 在线永久看片免费的视频 | 爱豆国产剧免费观看大全剧集 | youjizz国产 | 宅男在线视频 | 日韩美女啪啪 | 三女警花合力承欢猎艳都市h | 日韩成人在线免费视频 | 91手机视频在线观看 | 国产又粗又猛又黄又爽的视频 | 成人六区 | 中文字幕第一页av | 少妇高潮一69aⅹ | 日本护士取精xxxxxhd | 永久免费精品影视网站 | 亚洲在线观看一区二区 | 欧美日韩亚洲不卡 | 欧美激情精品久久久久久蜜臀 | 岛国午夜视频 | 欧美一区二区二区 | 久久国色 | 国产福利资源 | 好姑娘在线观看高清完整版电影 | 欧美一级片在线 | 免费高清av | 久久影音先锋 | 欧美三级少妇高潮 | 欧美日韩精品一区二区在线观看 | 亚洲男女在线观看 | 久久久精品国产sm调教 | 欧美黄色免费网站 | 最新中文字幕在线视频 | 老熟妇一区二区三区啪啪 | 成人影视在线看 | 性色av蜜臀av浪潮av老女人 | 精品中文字幕一区二区三区 | 黄色一级影片 | 国内自拍偷拍视频 | 一区二区亚洲精品 | 天天色天| 午夜av在线播放 | 亚洲免费播放 | 亚洲一区二区三区在线视频观看 | 欧美综合成人 | 91国产中文字幕 | 澳门黄色录像 | 久久九九精品 | 波多av在线 | 国产亚洲av在线 | 女女百合高h喷汁呻吟玩具 www.亚洲一区 | 欧美色涩| 欧美视频在线不卡 | 亚洲黄色影院 | 日韩无套无码精品 | www,四虎 | 久久综合一区二区 | 久久美利坚| 亚洲精品综合久久 | 婷婷丁香六月 | 日本欧美三级 | 一级片www | 国产精品人成在线观看免费 |