- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Stack 之應用 — 迷宮問題 2009.04 綠園 請思考下列迷宮問題: 問題一: 應如何將此迷宮以二維陣列記錄起來? 想想看: 問題一: 應如何將此迷宮以二維陣列記錄起來? 想想看: 問題二: 為了能夠迅速走出迷宮,使之在搜尋的過 程中,不致誤判而跑出外面,要如何增加 一些訊息以判斷撞牆。 問題二: 為了能夠迅速走出迷宮,使之在搜尋的過 程中,不致誤判而跑出外面,要如何增加 一些訊息以判斷撞牆。 問題三:請記錄此刻的迷宮資料。 問題三:請記錄此刻的迷宮資料。 【演算法策略】 迷宮的縱向設為i,橫向設為j,迷宮內的任意位置設為(i, j)。 入口座標設為____,出口座標設為____。 準備二個Stack:Pi[], Pj[],分別存放找到的路徑之x座標 與 y座標。 stack 一開始為空。所以top 一開始應為0,指在stack 的最底部。 往前有路,把下一點的 i, j 值分別 push 入 stack Pi[]與 stack Pj[]中。且top++。 往前若無路,則退回。top--。 最後,若前進至出口,則表示走完了。把stack中的i與 j值輸出來,即為迷宮路徑。 有可能無解。 所有的變數設在全域變數中。 【主程式】 int main() { top = 0; //堆疊指標的初始設定 success = 0; //顯示是否成功走出迷宮 Si = 1; Sj = 1; //設定入口的位置 Ei = 5; Ej = 5; //設定出口的位置 if ( visit(Si,Sj) == 0 ) cout “沒有出路 endl; return 0; } 【開始找尋:visit 函數的設計 】 int visit(int i, int j) { mark(i,j) 的value 為 2,表示這個位置走過。 Pi[top]=i; Pj[top]=j; //把(i,j)的值分別存在Pi[],Pj[]兩堆疊的最頂端 //(top目前所指) top++; //把top 往上移動 if (到了出口) { 輸出所有路徑; //即以for 迴圈把Pi[]與Pj[]中的值印出來 success = 1 ; //表示任務成功了。 } else //如果還沒到出口,則走訪旁邊的位置 { if ((i+1, j) 有路) 則 visit(i+1, j); //往東邊檢查 if ((i, j+1) 有路) 則 visit(i, j+1); //往南邊檢查 if ((i-1, j) 有路) 則 visit(i-1, j); //往西邊檢查 if ((i, j-1) 有路) 則 visit(i, j-1); //往北邊檢查 top--; //若以上皆無路,則後退一步。把原本在堆疊中的資料去除一筆。 } return success; } 試完成此迷宮之程式碼。 * * 入口 出口 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 4 3 2 1 0 4 3 2 1 0 j i -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 0 1 0 1 0 -1 -1 0 1 0 1 1 -1 -1 1 0 1 0 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 2 3 4 5 6 0 1 2 3 4 5 6 i j ② ① ( i , j ) ③ ④ 【開始找尋:visit 函數的設計 】 i j i +1 i - 1 j - 1 j +1 *
文档评论(0)