dfs解決迷宮問題(找步數)

2022-09-09 19:15:28 字數 3174 閱讀 9861

dfs為深度優先搜尋,即為順著一條道走到黑,當什麼時候走不動了,才開始往回開始走,它與bfs則不同,bfs是邊走邊看,把每種可能都看一下,但是dfs只要找到一條道路即可。話不多說了,直接看題把

問題描述:

小明置身於乙個迷宮,請你幫小明找出從起點到終點的最短路程。

小明只能向上下左右四個方向移動。

輸入

輸入包含多組測試資料。輸入的第一行是乙個整數t,表示有t組測試資料。

每組輸入的第一行是兩個整數n和m(1<=n,m<=100)。

接下來n行,每行輸入m個字元,每個字元表示迷宮中的乙個小方格。

字元的含義如下:

『s』:起點

『e』:終點

『-』:空地,可以通過

『#』:障礙,無法通過

輸入資料保證有且僅有乙個起點和終點。

輸出

對於每組輸入,輸出從起點到終點的最短路程,如果不存在從起點到終點的路,則輸出-1。

樣例輸入

1

5 5s-###

-----

##---

e#---

---##

樣例輸出

9

下面我來分別介紹一下bfs和dfs來解決問題得思路:

1、bfs迷宮問題在我得前一篇已經詳細講解了,若是沒有看的話,請先去看,看完之後你會感覺豁然開朗。下面我就直接放bfs的**了:

1 #include 2

3 typedef structss4

ss;8 ss queue[100];9

intsx,sy,dx,dy;

10int visit[100][100]=;

11int dxy[4][2]=,

13 ,

14 ,

15

16};

17int

a,b,step;

18int array[100][100

];19

void dfs(int x,int

y);20

void print_data(int

rear);

21int main(int argc, char *ar**)

2241

else

if(st[i][j]=='e'

)4247else

if(st[i][j]=='-'

)48 array[i][j]=0;49

else

if(st[i][j]=='#'

)50 array[i][j]=1;51

}5253}

5455

//printf("dx=%d,dy=%d\n",dx,dy);

5657

for(i=0;i)

5863

dfs(sx,sy);

64 printf("

%d%",step-1

);65

return0;

66}6768

void dfs(int x,int

y)69

9394

if(next_x==dx&&next_y==dy)

95 print_data(rear-1

);96

}97 front++;98}

99}100101

void print_data(int

rear)

102111

112113 }

2、dfs去找步數真的是非常的方便啊,下面直接在**上注釋,**如下:

1 #include 2

#define max 0xffff

3#define maxline 100

4int

sx,sy,dx,dy; //sx用來接收起點的x座標,sy用來接收起點的y座標;dx是用來接收終點的x座標,dy是用來接收終點的y座標

5int

a,b; //a,b分別是你要輸入的迷宮的寬度和長度

6int

dis[maxline][maxline]; //定義乙個距離陣列,用來存放距離

7int dxy[4][2]=,

9 ,

10 ,

11

12}; //用來改變方向的

1314

void dfs(int sx,int sy,int

step);

15bool cmp(int next_x,int next_y,int

step);

16int main(int argc, char *ar**)

1734

else

if(ch=='e'

)3540else

if(ch=='-'

)41 dis[i][j]=max;

42else

43 dis[i][j]=0;44

}45} //接收資料,並且把可以通過的距離設定為最大值,不可通過的距離設定為0

4647

for(i=0;i)

48 //列印出我們設定的距離

5354 dfs(sx,sy,0

); //將起點和當前步數傳入到dfs

55 printf("

%d",dis[dx][dy]==max?-1

:dis[dx][dy]);

56return

0; 57}

5859

void dfs(int sx,int sy,int

step)

6072}73

}7475bool cmp(int next_x,int next_y,int

step)

76

DFS實現迷宮,列印路徑輸出步數

問題描述 直接給 吧,中的注釋寫的很詳細了。include includeusing namespace std int m,n 行 列 int map 81 81 迷宮 int vis 81 81 標記是否訪問過 int next step 4 2 訪問的四個方向,右下左上 int count 記...

最少步數 迷宮問題型別)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述這有乙個迷宮,有0 8行和0 8列 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1...

迷宮問題dfs

迷宮問題 棧作為深度優先遍歷 dfs 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋 可以最快的找到解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct sttype 迷宮問題常用...