注:為了不離開本節討論的重點--棧,迷宮的自動生成以後重新寫。這裡用簡單的二維陣列代替,手動迷宮,呵呵!
// 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.當棧頂元素彈出時,我們又要重新對棧頂元素周圍的方塊進行檢驗,為避...