線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1581
推到 Plurk!
推到 Facebook!

老鼠走迷宮問題~~

尚未結案
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-22 00:24:44 IP:203.70.xxx.xxx 未訂閱
#include #include int visit(int, int); int maze[7][7] = {{2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 2, 0, 2, 2}, {2, 2, 0, 2, 0, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 2, 2, 2, 2, 2, 2}}; int si = 1, sj = 1; // 入口 int ei = 5, ej = 5; // 出口 int success = 0; int main(void) { int i, j; printf("顯示迷宮:\n"); for(i = 0; i < 7; i ) { for(j = 0; j < 7; j ) if(maze[i][j] == 2) printf("█"); else printf(" "); printf("\n"); } if(visit(si, sj) == 0) printf("\n沒有找到出口!\n"); else { printf("\n顯示路徑:\n"); for(i = 0; i < 7; i ) { for(j = 0; j < 7; j ) { if(maze[i][j] == 2) printf("█"); else if(maze[i][j] == 1) printf("◇"); else printf(" "); } printf("\n"); } } return 0; } int visit(int i, int j) { maze[i][j] = 1; if(i == ei && j == ej) success = 1; if(success != 1 && maze[i][j 1] == 0) visit(i, j 1); if(success != 1 && maze[i 1][j] == 0) visit(i 1, j); if(success != 1 && maze[i][j-1] == 0) visit(i, j-1); if(success != 1 && maze[i-1][j] == 0) visit(i-1, j); if(success != 1) maze[i][j] = 0; return success; } ________________________________________________________________ 上面是完整程式碼~ 下面是我有疑問地方希能懂得人可以解釋給我聽謝謝 不懂地方 : 入口點在座標(1,1)使用if判斷是否使用遞迴路徑走到座標到(2,5)發現這路徑是失敗之後會執行下面3段程式碼陣列位置maze[2][5]設定成0 不過讓我百思不解的是之後的return success;它外部變數預設為0 這樣不就這函式判斷就結束..還有座標(1,2)(1,3)(1,4)(1,5)&(2,5)的值都是1;它是如何變回0??是遞迴關係嗎?? 如果是可以方便把還原順序寫給我看嗎?? if(success != 1) maze[i][j] = 0; return success; 有誰可以回答我的問題???想了很久還是不懂~@@ 謝謝 發表人 - syao 於 2005/02/22 00:36:32
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-22 00:32:47 IP:203.70.xxx.xxx 未訂閱
引言: #include #include int visit(int, int); int maze[7][7] = {{2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 2, 0, 2, 2}, {2, 2, 0, 2, 0, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 2, 2, 2, 2, 2, 2}}; int si = 1, sj = 1; // 入口 int ei = 5, ej = 5; // 出口 int success = 0; int main(void) { int i, j; printf("顯示迷宮:\n"); for(i = 0; i < 7; i ) { for(j = 0; j < 7; j ) if(maze[i][j] == 2) printf("█"); else printf(" "); printf("\n"); } if(visit(si, sj) == 0) printf("\n沒有找到出口!\n"); else { printf("\n顯示路徑:\n"); for(i = 0; i < 7; i ) { for(j = 0; j < 7; j ) { if(maze[i][j] == 2) printf("█"); else if(maze[i][j] == 1) printf("◇"); else printf(" "); } printf("\n"); } } return 0; } int visit(int i, int j) { maze[i][j] = 1; if(i == ei && j == ej) success = 1; if(success != 1 && maze[i][j 1] == 0) visit(i, j 1); if(success != 1 && maze[i 1][j] == 0) visit(i 1, j); if(success != 1 && maze[i][j-1] == 0) visit(i, j-1); if(success != 1 && maze[i-1][j] == 0) visit(i-1, j); if(success != 1) maze[i][j] = 0; return success; } ________________________________________________________________ 上面是完整程式碼~ 下面是我有疑問地方希能懂得人可以解釋給我聽謝謝 不懂地方 : 入口點在座標(1,1)使用if判斷是否使用遞迴路徑走到座標到(2,5)發現這路徑是失敗之後會執行下面3段程式碼陣列位置maze[2][5]設定成0 不過讓我百思不解的是之後的return success;它外部變數預設為0 這樣不就這函式判斷就結束..還有座標(1,2)(1,3)(1,4)(1,5)&(2,5)的值都是1;它是如何變回0??是遞迴關係嗎?? 如果是可以方便把還原順序寫給我看嗎?? if(success != 1) maze[i][j] = 0; return success; 有誰可以回答我的問題???想了很久還是不懂~@@ 謝謝
kagaya
中階會員


發表:74
回覆:175
積分:59
註冊:2002-12-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-24 18:21:51 IP:210.200.xxx.xxx 未訂閱
return success是傳回visit這個函數的值 main裡面return 0才會結束 座標是在 if(success != 1) maze[i][j] = 0; 這裡變成0的
------
KUSO 無處不在
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-04 23:06:53 IP:218.172.xxx.xxx 未訂閱
你要把他想成一顆樹    這裡省略用v(x,y)代表visit(x,y)
        Start
        v(1,1)
         |
   v(1,2)------ -----v(2,1)
    |         |
   v(1,3)      v(3,1)
    |         |
 v(1,4) v(2,3)     v(3,2)
  |   |        |
 v(1,5)  *      v(4,2)
  |           |
 v(2,5)        v(5,2)
  |           |
  *       v(5,1)-- --v(5,3)
           |    |
           *    v(5,4)
                |
               v(5,5)
                |
                End
v(1,1) 往下一層 有 v(1,2) 跟 v(2,1) 代表 v(1,1) 裡面呼叫 v(1,2) 跟 v(2,1) 所以回答你的問題 > 不過讓我百思不解的是之後的return success; success它外部變數預設為0 > 這樣不就整個都結束了 success 是在 v(5,5) 的時候 發現這點是終點 才設為1 然後 v(5,5) 就功成身退 return 1; 上一層 v(5,4) 也同樣的功成身退 return 1; 一直回到 v(1,1) 他也會 return1; 主程式就知道有找到終點 > 還有座標(1,2)(1,3)(1,4)(1,5)&(2,5)的值都是1;它是如何變回0 同樣看上面樹的左邊 走到 * 表示無法搜尋下去了 在v(2,5)裡面 沒有找到終點 也沒有點可以延伸下去找了 所以 下面就會把那一點設回0
  if(success != 1) 
        maze[i][j] = 0;
然後return success; 也就是return 0; 他的上一層 v(1,5) 同樣也會return 0; 一直往上回碩到可以往別的點延伸的地方 也許講的不是很清楚..希望我的解釋你看的懂.. 發表人 - ccobj 於 2005/04/04 23:10:53
系統時間:2024-05-19 12:10:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!