DFS深度優先搜尋 迷宮問題

2021-10-12 13:41:38 字數 1858 閱讀 6585

首先我們用乙個陣列來儲存這個迷宮,用 1 代表障礙物,用 0 代表可通行的路

#define n 22

int maze[n]

[n]=,,

,,,,

,,,,

,,,,

,,,,

,,,}

;

假設我們現在處於 x,y 點( x、y 指 maze 陣列的行、列),對於接下來的每一條路徑,我們只能乙個乙個地去嘗試

我們可以先往右走,直到走不通的時候再退回來,然後再去嘗試另乙個方向,那麼我們可以約定嘗試的方向為順時針,即先右再下再……

於是可定義陣列

int next[4]

[2]=

,//向右

,//向下

,//向左};

//向上

用來表示前往下一步的前進方法

對於 dfs 函式,我們所需要的形參只有當前座標以及已走過的步數

void

dfs(

int x,

int y,

int step)

;

當我們所在的點與終點重合時,說明我們到達了終點

此時我們需要判斷此次路徑走過的長度是否為最小值,即

void

dfs(

int x,

int y,

int step)

return

;}

對於下乙個點,我們只需用迴圈歷遍即可

for

(int i=

0; i<

4; i++

)

接下來我們就需要對下乙個點進行判斷,是否遇到障礙物或是否越界或者是否走到了已經走過的路上

為了判斷已走過的點,我們需要乙個和迷宮相同大小的陣列 book 來標記已走過的路

如果這些條件都符合,我們就可以在下乙個點的基礎上拓展,用遞迴來實現接下來的路徑

void

dfs(

int x,

int y,

int step)

for(

int i=

0; i<

4; i++

)//依次從向右走開始順時針歷遍

}return

;}

由於我們要倒退嘗試不同的路徑,因此倒退時要將剛剛的點標記為未走過,否則將無法實現接下來的路徑

#include

#include

#define n 22

int maze[n]

[n]=,,

,,,,

,,,,

,,,,

,,,,

,,,}

;int book[22]

[22];

//用於標記已走過的路程

int gx=

20, gy=

0, min=

999999

;//終點位置

int next[4]

[2]=

,//向右

,//向下

,//向左};

//向上

void

dfs(

int x,

int y,

int step)

for(

int i=

0; i<

4; i++

)//依次從向右走開始順時針歷遍

}return;}

intmain()

本人萌新一枚,若引起大佬不適,還請多多指點?

深度優先搜尋DFS(迷宮問題)

問題及 給出迷宮的圖紙和初始終點位置,用dfs求最小步數。include using namespace std int n,m,p,q,min 99999999 int a 51 51 book 51 51 void dfs int x,int y,int step 順時針 右下左上 int tx...

深度優先搜尋(DFS)求解迷宮問題

給乙個n行m列的2維的迷宮,s 表示迷宮的起點,t 表示迷宮的終點,表示不能通過的點,表示可以通過的點。你需要從 s 出發走到 t 每次只能上下左右走動,並且只能進入能通過的點,每個點只能通過一次。現在要求你求出有多少種通過迷宮的的方案。輸入格式 第一行輸入n,m 1 n,m 10 表示迷宮大小。接...

DFS深度優先搜尋之走迷宮

走迷宮 problem description 乙個由n m個格仔組成的迷宮,起點是 1,1 終點是 n,m 每次可以向上下左右四個方向任意走一步,並且有些格仔是不能走動,求從起點到終點經過每個格仔至多一次的走法數。input 第 一行乙個整數t 表示有t 組測試資料。t 110 對於每組測試資料 ...