用棧 求迷宮問題(最短路徑和全部路徑)

2021-08-30 17:41:27 字數 1189 閱讀 9736

這是資料結構的作業,便找書邊看網上,然後自己慢慢寫出來的,這裡面主要是回溯法。

因為課本上是列印出一條路徑,然後我在想怎樣能將所有的路徑都輸出來,方法:就是當求出一條路徑後,將出口點變成可以走的點(因為之前將其值變成了-1),並且將棧頂元素出棧,還需要得到現在棧頂元素的i,j,di值,將其賦出來。

這裡的思路是這樣的,因為找最後乙個點的時候是找倒數第二個點的上下左右四個方位,假設說是路徑通暢的點是倒數第二個點的上面的點,當我們找另一條路徑時,那麼現在我們應該順時針從次棧頂右面的點試探,檢視是不是可行的點。

#include #define max 9999

int mg[6][6] = ,,,,,

};typedef struct box;

typedef struct sqstack;

int initsqstack(sqstack *s)

int destroy(sqstack *s)

int push(sqstack *s, box *e)

int gettop(sqstack *s, box *e)

int pop(sqstack *s, box *e)

int empty(sqstack *s)

//1是空,0是非空。

int man(sqstack *s)

int zmg(int x, int y, int xe, int ye)

printf("\n");

if (tp + 1 < minlen)

s.top = tp;

minlen = tp + 1;

}mg[i][j] = 0;

pop(&s, &e);

gettop(&s, &e);

i = e.i;

j = e.j;

di = e.di;

} fun = 0;

while (di < 4 && fun != 1)

if (mg[x1][y1] == 0)

fun = 1;

} if (fun == 1)

else

}printf("\n");

printf("最短路徑的長度%d,m:",minlen);

for(n=0;ndestroy(&s);

return 0;

}int main()

迷宮問題 壓棧 回溯 全部路徑 最短路徑

用迴圈模擬壓棧來實現迷宮問題 arg.att 這個狀態用來標記我們是否試走過 此處 的四個方位,因為0是牆,1是路,所以我們用2來表示我們試過此處的左邊能不能通行,3用來表示此處的上方是否通行,4表示右邊,5表示下邊。用6來表示出口。假如說試過左邊不能走,我們就將標記改為3,讓他繼續試上邊能不能走。...

迷宮問題(求最短路徑長度和最短路徑)

描述 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。輸入乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。輸出左上角到右下角的最短路徑,格式如樣例所示。樣例輸入 0 1...

用棧解決迷宮問題(輸出所有路徑和最短路徑)

include includeusing namespace std define m 4 行數 define n 4 列數 define maxsize 100 棧最多元素個數 int mg m 2 n 2 struct migong stack maxsize path maxsize 定義棧和...