經典迷宮問題1

2021-07-08 09:53:30 字數 2465 閱讀 6270

下面給出迷宮問題的乙個直觀感受圖,下圖中棕色代表通道阻塞,白色代表可用通道,紅色代表起始位置,綠色代表當前位置,黃色代表出口。

迷宮1:

首先將入口設為當前位置;然後從當前位置出發,按照固定順序(例如:右左上下順序)探測第乙個可用下乙個單元,然後將這下乙個單元設為當前單元,重複探測,直至遇到出口;如果探測的過程中發現,在當前節點,無論右左上下哪個位置都不能到達下乙個可用位置,則退回到當前節點的上乙個節點,將上乙個節點設為當前單元,繼續探測。依次類推。

這裡注意幾點:

1)

每個走過的單元,必須標記為已經走過,後面不能再重複走。

因為走過的單元, 分為兩種,第一種可以找到出口的,那麼你再次走回來,可能陷入同一段路徑的迴圈,

比如 a->b->c->a->b->c。我們要消除這種重複路徑。

第二種,是不能找到出口的,既然第一次走過就不能找到出口,為什麼還要走第二次?

所以,走過的單元不能再重複的走。

2)

每次從單元格四個方向中選個乙個可用單元,要保持對這四個方向的計數,上次嘗試過得方向,下一次就不能重複再試了,反證法可以說明。

3)

程式出口問題,要麼是試驗後找到路徑,這時棧裡儲存的就是整個路徑;要麼是找不到路徑,那麼棧為空,因為你不斷回退,最後到了起點,起點還是沒有路徑,因此退棧後即為空棧。

#include#include#include#define m 8

#define n 8

using namespace std;

/*每次按照dir的方向進行深度優先搜尋,可以走則走並標記,否則,

回溯並清除標記,直到找到右下角的出口。

*/// 迷宮,maze[i][j] = 0 代表ij可以走, arr[i][j]=1表示不能走

int maze[m+2][n+2] = ,

, ,

, ,

, ,

, ,

};// 四個方向,分別代表上,下,左,右

int dir[4][2] = , , , };

// 節點資訊,x代表橫座標,y代表縱座標

struct node

};// 列印路徑,使用鍊錶,易於輸出

void print_path(listpath)

}int dfs(node cur, node end, list&path)

// 從4個方向分別探索

for(int i = 0; i < 4; ++i) }

// 如果該節點幾個方向均已遍歷,而且都不可行,該節點出棧,回溯

path.pop_back();

return 0;

}int main( )

採用深度優先遍歷時,求出路徑不應定最短;由此,提出以下演算法,主要思想是利用佇列,採用廣度優先搜尋法,當第一次出現目的點時,中斷搜尋,並輸出路徑。

#include #include #include #define m 8

#define n 8

using namespace std;

// 迷宮,maze[i][j] = 0 代表ij可以走, arr[i][j]=1表示不能走

int maze[m+2][n+2] = ,

, ,

, ,

, ,

, ,

};// 節點資訊,x代表橫座標,y代表縱座標

struct node

};// 虛擬佇列中的節點及其前驅資訊

struct queueelem

};void print_path(vector&que)

while(!s.empty())

}void maze_shortest(node start, node des)

, , , };

vectorque; // 用於記錄節點入隊順序

int head = 0; // 用於指向佇列頭部

que.push_back(queueelem(start, -1)); // 初始點入隊,其前驅為-1

while(head < que.size()) // 當虛擬佇列非空時}}

head++; // 虛擬出隊

}}int main()

經典迷宮問題

經典的迷宮問題,分別用了bfs與dfs解決。include include using namespace std 6 8 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 ...

經典迷宮問題BFS

給定乙個迷宮,入口為左上角,出口為右下角,問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上 下 左 右 上左 上右 下左 下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。易得可以用1將迷宮圍起來避免邊界問題。本題採用bfs演算法給出解。注意,利用bfs演算法給出的路徑必然是一...

迷宮問題 (經典dfs)

題目 迷宮問題,給你乙個n m的矩陣,其中0代表通路,1代表阻塞。給你起點座標和終點座標,詢問 最小路徑從起點到達終點。題目分析 一般問你最小的基本都是dfs或者bfs,再其次,能用bfs的基本都能用dfs 個人理解 include include include include using nam...