利用棧對迷宮求解,採用的基本方法是回溯法,其實也算是一種暴力破解吧...畢竟是將乙個乙個方塊檢驗直至終點或者棧空。
入棧:當棧頂元素方塊周圍有可行方塊時,將該可行方塊入棧
出棧:當棧定元素的方塊周圍都沒有可行方塊時,出棧
有幾點需要注意:
1.當棧頂元素彈出時,我們又要重新對棧頂元素周圍的方塊進行檢驗,為避免進入死迴圈,所以需要記錄一下該棧頂元素已經記錄到周圍哪一塊
2.當入棧的時候,原棧頂元素與新棧頂元素之間都成周圍元素關係,為避免死迴圈,需要將每乙個進入棧中的元素在迷宮中變成「不通」,即變成不可行方塊
還有一點需要說明:
乙個迷宮可能有多個不同路徑,利用棧的不能夠找到最優路徑...所以路徑可能不一致...
我為了熟悉c++中的stack唯一沒有自己對stack重新定義,所以可能複雜了...莫怪!
#ifndef maze_h
#define maze_h
#includeusing namespace std;
const int col = 10;
const int row = 10;
struct node
node & operator=(const node &node)
bool operator==(const node &node)
bool operator!=(const node &node)
};class maze
~maze(){};
void createmaze(const int num[col] , int row ,int col);
void getpath(int si ,int sj ,int ei ,int ej);//輸入開始和終點位置(s==start ,e==end)
void display() ; };
#endif
#include"maze.h"
#includevoid maze::createmaze(const int num[col], int row, int col)
}void maze::getpath(int si, int sj, int ei, int ej)
int i = temp.count, tempi , tempj;
bool flag= false;
while (i < 4)
if (maze[tempi][tempj].flag == 0)
else i++;
}if (!flag) }}
void maze::display()
}
#include#include"maze.h"
using namespace std;
int main(), ,
, ,, ,
, ,, };
maze maze;
maze.createmaze(num, row, col);
maze.getpath(1, 1, 8, 8);
maze.display();
system("pause");
return 0;
}
棧的應用之迷宮
棧是後進先出的,棧分為順序棧和鏈棧 順序棧是由一組位址連續的儲存單元構成,依次存放從棧底到棧頂的資料元素 鏈棧是一組位址可不連續的儲存單元構成,鏈棧的建立過程類似於採用前插法建立鍊錶 注意程式中棧的操作,push pop gettop 等等。網上有一段利用棧完成的程式,可以拿來欣賞一下,首先感謝一下...
棧的應用之求解迷宮問題(棧操作)
給定乙個m n的迷宮圖,求一條從指定入口和出口的迷宮路徑。假設迷宮圖如圖所示 m n 6的迷宮圖 為了表示迷宮,設定乙個陣列mg,其中每個元素表示乙個方塊的狀態,為0表示方塊是通道,為1表示方塊是障礙物 不可走 為了演算法方便,一般在迷宮的外圍加一條圍牆,例如上圖的迷宮表示為 由於迷宮四周加了一道圍...
棧的應用 迷宮
使用c 構建帶環迴路迷宮,並使用迭代法,遞迴法求出口 使用遞迴方法求迷宮的最短路徑 其實在列印最短路徑是使用佇列的話路徑就不是反著的了 pragma once includeusing namespace std include includetypedef struct pos pos class...