老鼠走迷宮問題~~ |
尚未結案
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
#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 發送簡訊給我 |
引言: #include |
kagaya
中階會員 發表:74 回覆:175 積分:59 註冊:2002-12-28 發送簡訊給我 |
|
ccobj
一般會員 發表:6 回覆:27 積分:21 註冊:2003-12-02 發送簡訊給我 |
你要把他想成一顆樹 這裡省略用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) | Endv(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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |