HDU 1728 逃離迷宮

2021-07-15 11:07:34 字數 2666 閱讀 2033

problem description

給定乙個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), (x

2, y

2)表示兩個位置,其中x

1,x2對應列,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

這道題的基本思路容易想到,就是坑太多,優先佇列的基礎上,點的結構體多了乙個記錄方向的變數,在這裡我加了兩個記錄xy的變化,在用乙個變數記錄轉彎次數。優先順序可想而知就是轉彎次數越小的越優先搜尋。

然後再說說坑

1.輸入首先就坑了不少人,先輸入的資料是m,n,後面輸入x,y,還有中間用到的i,j;m-i-y為行數也就是縱座標,n-j-y為列數也就是橫座標。

2.題目很多隱含條件,除了給定座標出界以外,還有k<0的情況,有些寫法要考慮,走不通要考慮,起點終點一樣要考慮,起點終點有乙個是牆要考慮。

3.我就掉在這了,原以為優先佇列已經把一切先後順序排好了,結果發現有時候權值一樣的點也是不同的,應為此題權值是轉彎數,而你走到乙個權值相同的點方向是不一樣的,但優先佇列不能判斷出這點不同,最佳的方向走必經的那個點可能已經其他方向來的走過而不能再走。所以要加乙個手動判斷的,加固一下,到每個點比較一下如果新來的比原來的小則走過的點也有機會再次被遍歷,取最優解。

#include#include#include#includeusing namespace std;

int t,n,m;

char c[105][105];

struct node

};int b[4][2]= ;

int main()

getchar();

}scanf("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2);

if(k<0||x1<1||y1<1||x2<1||y2<1||x1>n||y1>m||x2>n||y2>m)

goto noway;

if(c[y2][x2]=='*'||c[y1][x1]=='*')

int map[105][105];

for(i=0; i<105; i++)

for(j=0; j<105; j++)

map[i][j]=9999999;

priority_queueq;

node front,rear;

front.i=y1;

front.j=x1;

front.di=0;

front.dj=0;

front.d=-1;

q.push(front);

int e=0;

while(!q.empty())

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

if(rear.d<=map[rear.i][rear.j])}}

}if(!e)

goto noway;

}return 0;

}/**

5 5.***.

.*.*.

.*...

...**

.*...

5 5**...

**.**

.....

**.*.

**...

*/

2

5 5.....

.*.*.

.....

.*.*.

.....

1 1 1 3 4

結果yes

hdu 1728 逃離迷宮

思路 一開始我是往左和往右走,不轉彎,計數不用加,往上和往下走,就轉彎,計數就加一,進行廣搜,搜到最後那個點,比較就可以啦,但是華麗麗的wa啦。所以改一條路搜到底,走不了啦,就一定要轉彎啦。include include include includeusing namespace std stru...

HDU 1728 逃離迷宮

bfs 搞清楚是轉彎而不是步數。所以需要乙個方向一直走下去直到邊界或者牆。還有就是注意題意。給出起點終點的 x,y 位置是交換的。題目是下標1開始。注意。include include include include include include include include include i...

HDU 1728 逃離迷宮

逃離迷宮 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中...