蠻力法 求解迷宮問題 DFS和BFS

2021-10-24 04:04:34 字數 1979 閱讀 8550

問題描述:

有如圖8×8的迷宮

o******x

ooooo***

xoxxooox

xoxxoxxo

xo******

xooooxoo

******xo

其中,o表示通路方塊,x表示障礙方塊。

假設入口位置為(0,0)出口為右下角方塊位置(7,7)設計乙個程式求指定入口到出口的一條迷宮路徑。

分析

用n表示迷宮大小,用二維陣列maze存放迷宮,從(x,y)方塊可以試探上、下、左、右4個方位。假設總是按從方位0到方位3的順序試探,各方位對應的水平方向偏移量h[4]=、垂直偏移量v[4]=

從(x,y)出發(初始為入口)搜尋目標(出口)。對於當前方塊(x,y),需要試探4個相鄰的方塊將對應的迷宮值由『o』改為『 』(空格字元),當回過來時將其迷宮值恢復為『o』。

**1:

#include

#define maxn 10

int n=8;

char maze[maxn]

[maxn]=,

, ,, ,

, , ,

};int h[4]

=; //水平偏移量,下標對應方位號1~3

int v[4]

=; //垂直偏移量

一定是最短路徑

從(x,y)出發(初始為入口)搜尋目標(出口)。由於在stl中queue不能順序遍歷,這裡用乙個陣列作為非迴圈佇列,front和rear分別為對頭和隊尾(初始值均設定為-1),每個進隊元素有唯一下標

struct position

;

定義佇列:

position qu[maxq]

;int front=-1,rear=-1;

首先,將根入口方塊(其pre置為-1)進隊,佇列不空時迴圈:出隊方塊p1作為當前方塊(在佇列陣列中的下標為front),若p1為出口,通過佇列陣列qu反向退出迷宮路徑並輸出;

否則查詢p1的每乙個相鄰方塊p2,若p2位置有效(即p2.x>=0&&p2.y>=0&&p2.x**2:

#include

#define maxq 100

#define maxn 10

int n=8;

char maze[maxn]

[maxn]=,

, ,, ,

, , ,

};int h[4]

=; //水平偏移量,下標對應方位號1~3

int v[4]

=; //垂直偏移量

struct position //佇列元素型別

;position qu[maxq]

; //定義佇列qu

int front=-1,rear=-1; //對頭和隊尾

void disp(int front)

for(i=0;i

) //輸出迷宮路徑 }

蠻力法求解「獄吏問題」

問題描述 獄吏問題 某國王對囚犯進行大赦,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次按所定規則轉動n間牢房中的某些門鎖,每轉動一次原來鎖著的被開啟,原來開啟的被 鎖上通過n次後,門鎖開著的,牢房中的犯人被放出,否則,犯人不得釋放。轉動門鎖的規則是這樣的,第一次通過牢房,從第一間開始轉動每一把鎖,...

蠻力法求解冪集問題

對於給定的正整數n n 1 求1到n構成的集合的冪集 包括全集和空集 思路將二進位制位與冪集對應起來,n的冪集個數為2 n2 n 2n,每乙個二進位制位代表乙個元素。下面以n等於3為例。集合元素 對應的二進位制位 對應的十進位制數 000 0011 0102 0113 1004 1015 1106 ...

回溯法求解迷宮問題

題目 這是我在老師發的ppt上發現的一道題,如下 1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。求解思路 每個路口最多有三個搜尋分支。把演算法設計為如下的搜尋過程 把整個搜尋分解為向左 向前和向右三個方向上子問題的搜尋。當搜尋到某個...