A 逃離迷宮 DFS

2021-08-21 17:52:09 字數 1678 閱讀 8460

給定乙個m × n (m行, n列)的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能走到迷宮外面去。令人頭痛的是,gloria是個沒什麼方向感的人,因此,她在行走過程中,不能轉太多彎了,否則她會暈倒的。我們假定給定的兩個位置都是空地,初始時,gloria所面向的方向未定,她可以選擇4個方向的任何乙個出發,而不算成一次轉彎。gloria能從乙個位置走到另外乙個位置嗎?

input

第1行為乙個整數t (1 ≤ t ≤ 100),表示測試資料的個數,接下來為t組測試資料,每組測試資料中, 

第1行為兩個整數m, n (1 ≤ m, n ≤ 100),分別表示迷宮的行數和列數,接下來m行,每行包括n個字元,其中字元'.'表示該位置為空地,字元'*'表示該位置為障礙,輸入資料中只有這兩種字元,每組測試資料的最後一行為5個整數k, x 1, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能轉的彎數,(x 1, y 1), (x2, y 2)表示兩個位置,其中x 1,x 2對應列,y 1, y 2對應行。 

output

每組測試資料對應為一行,若gloria能從乙個位置走到另外乙個位置,輸出「yes」,否則輸出「no」。

sample input

2

5 5...**

*.**.

.....

.....

*....

1 1 1 1 3

5 5...**

*.**.

.....

.....

*....

2 1 1 1 3

sample output

no

yes

思路:思路是選好乙個方向後就直沿著這個方向往前搜尋,直到到邊界或者碰到牆,中間如果這個點沒有搜過把它入佇列,如果搜過了我們直接跳過這個點搜下乙個,因為走到這個點時之前的方向是有多個的所以可以重複走,因為之前搜過了所以沒必要再重新入佇列。、

注意:此題的輸入是第乙個數是轉向的次數,後面是開始和結束的 列和行,這是和我們的習慣相反的,比較坑。

**:

#include

#include

#include

#include

using namespace std;

char s[110][110];

int book[110][110];

int n,m,k,ex,ey,sx,sy,zh,flag;

int to[4][2]= ;

struct note

;void bfs(int x,int y)

if(book[en.x][en.y]==0) //沒艘過入佇列                

en.x+=to[i][0];      //接著搜下乙個

en.y+=to[i][1];}}

}}int main()

flag=0;

book[sx][sy]=1;

bfs(sx,sy);

if(flag==0)

printf("no\n");

}return 0;

}

HDOJ 1728 逃離迷宮(DFS)

problem description 給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能...

HDU1728逃離迷宮(dfs 剪枝)

解題思路 一開始覺得是深搜模板題也沒多想,結果wa,發現輸入的出發點和終點都是先列再行 坑 改了下,又wa。起初的book陣列我用來存結點是否走過,原來這裡出bug了,題意是讓我們找結點是否能在k次轉彎內抵達。這裡存在著可能這個結點上次搜超過k次了,但是我們把他標記走過,等到下次經過這卻沒超過k次,...

HDOJ1728 逃離迷宮 DFS 剪枝

題目鏈結 problem description 給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,glo...