資料結構 使用棧Stack解決迷宮問題

2021-07-12 05:11:24 字數 1495 閱讀 5273

我們看下面這個迷宮----方陣(也可以是矩陣):

迷宮入口是座標(2,0)位置,出口是(9,3)。我們假定0代表通路,1代表不通。

現在需要找到哪一條路是通路。我們的思想是借助棧,「回溯法」。回溯是什麼意思呢???先從起點出發,檢查它的上下左右是否是通路(即是否有為數字0處)。也就是說為0通了,壓棧,將此位置元素變成2,這樣做的好處是明確通路路徑。然後繼續往下走,判斷上下左右 。直至我們找到終點(縱座標在矩陣的最後一行)。

我們來看下我針對迷宮問題實現的**:

#include#include#define n 10    //該迷宮10*10.

struct pos    //定義乙個結構體,該結構體用來表示座標。

};templatebool searchmazepath(int* a, int n, pos entry, stack& paths)    //尋找迷宮是否有通路。

//上pos tmp = cur;

--tmp._row;

if (a[tmp._row*n + tmp._col] == 0)

//下tmp = cur;    

++tmp._row;

if (a[tmp._row*n + tmp._col] == 0)

//左tmp = cur;        

--tmp._col;

if (a[tmp._row*n + tmp._col] == 0)

//右tmp = cur;

++tmp._col;

if (a[tmp._row*n + tmp._col] == 0)

paths.pop();    //若上下左右都不通,則回溯。

}return false;

}void getmaze(int* a, int n)    //讀取到迷宮圖案}}

}       

}void printmaze(int* a, int n)    //將此迷宮列印出來

cout <

}cout <

}void test()

;    pos sp(2, 0);    //入口座標

getmaze((int*) a, n);

printmaze((int*)a, n);

stackpaths;

searchmazepath((int*)a, n, sp, paths);  

//二維陣列實際儲存是一維陣列,將二維陣列強制轉換為一維陣列傳參。

printmaze((int*)a, n);

}int main()

有時候,針對迷宮問題,我們還需要求多條路徑的最優解(最短路徑)。那這時候我們可以用壓棧,利用棧幀一層一層壓棧的特點實現。

本文出自 「han jing's blog」 部落格,請務必保留此出處

資料結構 棧(Stack)

只允許在一端進行插入或刪除操作的線性表。首先,棧是一種線性表,但限定這種線性表只能在某一段進行插入和刪除操作。棧頂 top 線性表允許進行插入和刪除的一端。棧底 bottom 固定的,不允許進行插入和刪除的另一端。空棧 不含任何元素。如上圖 a1為棧底元素,an為棧頂元素。由於棧只能在棧頂進行插入和...

資料結構 棧stack

棧的概念與資料結構 棧 有時稱為 後進先出棧 是乙個元素的有序集合,其中新增移除新元素總發生在同一端。這一端通常稱為 頂部 與頂部對應的端稱為 底部 棧的底部很重要,因為在棧中靠近底部的元素是儲存時間最長的。最近新增的元素是最先會被移除的。這種排序原則有時被稱為 lifo,後進先出。它基於在集合內的...

資料結構 棧(Stack)

棧 英語 stack 又稱為堆疊或堆疊,棧作為一種資料結構,它按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 由於堆疊資料結構只允許在一端進行操作,因而按照後進先出 lifo last in first out 的...