棧的應用之迷宮

2021-07-05 21:08:00 字數 1636 閱讀 4557

利用棧對迷宮求解,採用的基本方法是回溯法,其實也算是一種暴力破解吧...畢竟是將乙個乙個方塊檢驗直至終點或者棧空。

入棧:當棧頂元素方塊周圍有可行方塊時,將該可行方塊入棧

出棧:當棧定元素的方塊周圍都沒有可行方塊時,出棧

有幾點需要注意:

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...