題意: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#includeusing
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...