我們看下面這個迷宮----方陣(也可以是矩陣):
迷宮入口是座標(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 的...