反思總結
最近看到一句區別棧和佇列很形象的話:
棧是先進後出,佇列是先進先出所以吃多了吐就是棧,吃多了拉就是佇列
如上面的迷宮,用棧實現求迷宮路徑的程式,所求路徑不需要是最短路徑,但必須是簡單路徑,即在求得的路徑上不能重複出現同一通道塊。比如當走到(1,8)時,發現無路可走了,則依次退棧,退到能走通的通道快,而不是往回走(即(2,8)再次入棧)。
窮舉求解main函式裡首先要建立乙個自定義的迷宮。用乙個二維陣列來記錄迷宮,把牆的值設為0,即不可通,把通道的值設為1,即可通。這裡的程式把迷宮的四周都設定為牆,然後設定迷宮內部牆的位置,再指定迷宮的入口和出口。
int x, y, i, j, n;
cout <<
"輸入迷宮的行數,列數:"
<< endl;
cin >> x >> y;
for(i =
0; i < y; i++
)// 定義上下邊的牆值為0
for(j =
1; j < x -
1; j++
)//定義左右邊除了第一行和最後一行的牆值為0(第一行和最後一行在上個迴圈中定義過)
for(i =
1; i < x -
1; i++
)//定義所有內牆值為1(即通路)
for(j =
1; j < y -
1; j++
) m[i]
[j]=1;
cout <<
"請輸入迷宮的內牆數:"
<< endl;
cin >> n;
for(i =
0; i < n; i++
)
typedef
int mazetype[maxlength]
[maxlength]
;// 迷宮陣列[行][列]
mazetype m;
//宣告乙個全域性迷宮物件m
typedef
int status;
typedef
struct
//座標
postype;
typedef
struct
selemtype;
//棧的元素型別
typedef
struct
stack;
status initstack
(stack &s)
;// 構造乙個空棧s
status push
(stack &s, selemtype e)
;//入棧
status pop
(stack &s, selemtype &e)
;//出棧,移除當前棧頂元素
status stackempty
(stack s)
;//檢測是否為空棧
void
(int x,
int y)
;// 輸出迷圖,0表示牆,1表示通路
void
footprint
(postype a)
;// 使迷宮m的a點的序號變為足跡(curstep)
postype nextpos
(postype c,
int di)
;// 根據當前位置及移動方向,返回下一位置
void
markprint
(postype b)
;// 使迷宮m的b點的序號變為-1(不能通過的路徑)
status mazepath
(postype start, postype end)
;// 若迷宮maze中存在從入口start到出口end的通道,則求得一條存放在棧中(從棧底到棧頂),並返回true;否則返回false
常常在程式中要使用到標誌變數,更好的運用標誌變數可以使程式更優秀。#include
#include
//realloc函式標頭檔案部分編譯器不需要此行**
using
namespace std;
const
int error =0;
const
int ok =1;
const
int false =0;
const
int true =1;
const
int stack_init_size =
100;
const
int stackincrement =10;
const
int maxlength =25;
// 設迷宮的最大行列為25
int curstep =1;
// 當前足跡,初值為1
typedef
int mazetype[maxlength]
[maxlength]
;// 迷宮陣列[行][列]
mazetype m;
//宣告乙個全域性迷宮物件m
typedef
int status;
typedef
struct
postype;
typedef
struct
selemtype;
//棧的元素型別
typedef
struct
stack;
void
(int x,
int y)
// 輸出迷宮圖,0表示牆,1表示通路
}status initstack
(stack &s)
// 構造乙個空棧s
status push
(stack &s, selemtype e)
//入棧
*(s.top)
++= e;
/*或者
*s.top = e;
*s.top++;
*/return ok;
}status pop
(stack &s, selemtype &e)
//出棧,移除當前棧頂元素
status stackempty
(stack s)
//檢測是否為空棧
status pass
(postype b)
// 當迷宮m的b點的序號為1(可通過路徑),return ok; 否則,return error。
void
footprint
(postype a)
// 使迷宮m的a點的序號變為足跡(curstep)
postype nextpos
(postype c,
int di)
// 根據當前位置及移動方向,返回下一位置,,
,};//
// 移動方向,依次為東南西北
c.x +
= direc[di]
.x; c.y +
= direc[di]
.y;return c;
}void
markprint
(postype b)
// 使迷宮m的b點的序號變為-1(不能通過的路徑)
status mazepath
(postype start, postype end)
// 若迷宮maze中存在從入口start到出口end的通道,則求得一條存放在棧中(從棧底到棧頂),並返回true;否則返回false
else
if(e.di <3)
// 沒到最後乙個方向(北)}}
}while(!
stackempty
(s))
;return false;
}int
main()
for(j =
1; j < x -
1; j++
)//定義左右邊除了第一行和最後一行的牆值為0(第一行和最後一行在上個迴圈中定義過)
for(i =
1; i < x -
1; i++
)//定義所有內牆值為1(即通路)
for(j =
1; j < y -
1; j++
) m[i]
[j]=1;
cout <<
"請輸入迷宮的內牆數:"
<< endl;
cin >> n;
for(i =
0; i < n; i++
(x, y)
;printf
("請輸入起點的行數,列數:");
cin >> begin.x >> begin.y;
printf
("請輸入終點的行數,列數:");
cin >> end.x >> end.y;if(
mazepath
(begin, end)
)// 求得一條通路
else
printf
("此迷宮沒有從入口到出口的路徑\n");
}
資料結構 棧實現迷宮尋路問題
思路 解決迷宮求解的問題,從入口出發,順某一方向向前探索,若能走通,則繼續往前走 否則沿原路退回,換乙個方向再繼續探索,直至所有可能的通路都探索到為止。為了保證在任何位置上都能沿原路退回,所以需要用乙個後進先出的結構來儲存從入口到當前位置的路徑。因此,在求迷宮通路的演算法 塊maze.h defin...
c資料結構 棧 迷宮問題(迴圈實現)
走迷宮步驟 使用二維陣列來表示迷宮地圖。1表示可以走,0表示不能走。設定迷宮入口。判斷迷宮入口是否合法。將入口點入棧 將當前點設定為入口點。loop 判斷是否能往左走,能則將當前點壓棧。goto loop 判斷是否能忘上走,能則將當前點壓棧。goto loop 判斷是否能往右走,能則將當前點壓棧。g...
資料結構之用棧實現迷宮問題(dfs)
給乙個n n的方格,讓你求從左上角到所給一點的任意一條路徑並輸出 該題用到dfs,以下是對dfs的簡要解析 詳解請參見 傳送門 dfs是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的...