棧的應用 迷宮解題(超詳細版!)

2021-06-22 03:13:37 字數 2290 閱讀 5723

注:為了不離開本節討論的重點--棧,迷宮的自動生成以後重新寫。這裡用簡單的二維陣列代替,手動迷宮,呵呵!

// datastructure_zjc.cpp : 定義控制台應用程式的入口點。  

/* 二. 棧的應用-迷宮解題

*/

#include "stdafx.h"

#include#include#include#define true 1

#define false 0

#define ok 1

#define error 0

#define infeasible -1

#define overflow -2

typedef struct

postype; //座標型別

typedef struct

elemtype; //棧的元素型別

int map[9][9] = /*二維陣列就夠用了,先從簡單的地圖開始*/

; /*-------------------------------------棧的元素型別定義完畢-------------------------*/

typedef int status; //函式返回值

#define stack_init_size 100 // 棧的初始大小

#define stack_increment 10 // 每次增加的空間大小

//下面給出棧的相關定義

typedef struct

zjc_stack;

//--------------------------------------棧基本操作的演算法部分--------------------------

//棧的初始化

status initstack(zjc_stack &s)

} //獲得棧頂元素

elemtype gettop(zjc_stack s)

//壓棧

status push(zjc_stack &s,elemtype e)

*s.top++ = e;

return ok;

} void print_path(zjc_stack s) //列印出棧中的元素

} //出棧函式

status pop(zjc_stack &s,elemtype &e)

} void pathaddtostack(int i,int j,elemtype temp,zjc_stack &robot) //因為要修改值,所以取位址,開始沒加取位址符號,棧頂元素一直是(1,1)

void mazh_solve(int endx,int endy) //解決迷宮問題函式,引數為終點的座標

else if( map[i + 1][j] == 1)

else if(map[i - 1][j] == 1)

else if(map[i][j - 1] == 1)

else //都走不動

}while( gettop(robot).x != endx || gettop(robot).y != endy); //只要棧頂元素的x,y不等於終點座標的x,y,則一直迴圈找路徑

printf("\n完成!\n");

print_path(robot); //列印出座標值

} int _tmain(int argc, _tchar* argv) //入口函式

其實在開始判斷一下起點與終點的相對位置,選擇不同的方案,這樣可以減少後面的某些判斷次數,提高效率。

比如我的這張地圖中,就應該優先判斷右下,因為終點在右下角。開始判斷一下相對位置,後面修改下if條件句的順序,就能提高效率了。

執行結果:

棧的應用 迷宮

使用c 構建帶環迴路迷宮,並使用迭代法,遞迴法求出口 使用遞迴方法求迷宮的最短路徑 其實在列印最短路徑是使用佇列的話路徑就不是反著的了 pragma once includeusing namespace std include includetypedef struct pos pos class...

棧的應用之迷宮

棧是後進先出的,棧分為順序棧和鏈棧 順序棧是由一組位址連續的儲存單元構成,依次存放從棧底到棧頂的資料元素 鏈棧是一組位址可不連續的儲存單元構成,鏈棧的建立過程類似於採用前插法建立鍊錶 注意程式中棧的操作,push pop gettop 等等。網上有一段利用棧完成的程式,可以拿來欣賞一下,首先感謝一下...

棧的應用之迷宮

利用棧對迷宮求解,採用的基本方法是回溯法,其實也算是一種暴力破解吧.畢竟是將乙個乙個方塊檢驗直至終點或者棧空。入棧 當棧頂元素方塊周圍有可行方塊時,將該可行方塊入棧 出棧 當棧定元素的方塊周圍都沒有可行方塊時,出棧 有幾點需要注意 1.當棧頂元素彈出時,我們又要重新對棧頂元素周圍的方塊進行檢驗,為避...