hdu 杭電 1728 逃離迷宮

2021-07-10 13:25:21 字數 1493 閱讀 1895

題意:m × n (m行, n列)的迷宮,給你兩個座標a(x1,y1),b(x2,y2),從a->b轉過的最少彎數是否滿足條件

滿足輸出「yes」,否輸出「no」

解法:廣搜,

特別注意:走過的點絕不可以標記,原因:

很多人說用優先佇列,但這題只要你標記了即使用優先佇列還是不行,原因:假設1轉彎數為5方向向右,2的轉彎數為5方向向右,1,2的轉彎數都為5都可在隊頭,假設此時點1在隊頭,點1先搜到點3,如果把3標記,點3的轉彎數為6,點2不能搜到點3,導致點3的轉彎數不是最小,結果不言而知的wa。

ac**:

#include#include

using

namespace

std;

const

int m=100+30

;const

int int=1000

;char map[m][m]; //

地圖int vis[m][m]; //

儲存每乙個點的最少轉彎數

int nn[4][2]=; //

方向向量:左,上,右,下

bool outside(int h,int z,int n,int m) //

判斷是否出界

struct

node

;int

main()

}for(i=1;i<110;i++) //

初始化每個節點的轉彎數為乙個很相當大的值

}struct

node temp;

intstep,a,b;

cin>>step>>temp.d>>temp.c>>b>>a; //

此題很炕人,必須注意座標的輸入循序為:y1,x1,y2,x2

temp.direction=-1; //

a(temp.c,temp.d)->b(a,b)

temp.step=0

; vis[temp.c][temp.d]=temp.step;

q.push(temp);

inth,z;

int foat=0

;

while(!q.empty())

else

//同向

if(temp.c==a&&temp.d==b&&step>=temp.step)//

滿足條件跳出迴圈

if(vis[temp.c][temp.d]>=temp.step)//

若當前點的轉彎數小於等於原來的轉彎數,}}

if(foat) break

; q.pop();

}if(foat)

cout

<

yes"

<

else

cout

<

<

while(!q.empty())

q.pop();

}return0;

}

杭電1728逃離迷宮解法二 BFS 搜尋

特別注意 走過的點絕不可以標記,原因 如圖三點1,2,3,假設1轉彎數為5方向向下,2的轉彎數為6方向向右,假設此時點2在隊頭,點2先搜到點3,如果把3標記,點3的轉彎數為6,點1不能搜到點3,導致點3的轉彎數不是最小。include includeusing namespace std const...

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...