题解 洛谷P2199 【最后的迷宫】
\(Sol\)
这道题我们可以用\(BFS\)解决!
我们先通过一个\(BFS\)预处理出\(Harry\)走到每一个格子所需的最短时间。
然后,我们从奖杯开始向八个方向展开,找\(Harry\)走到这些能够直接看到奖杯的最短时间。
注意:遇到墙就不能继续扩展了,视线是不能穿墙的!
\(Code\)
#include<bits/stdc++.h>
using namespace std;
struct Struct
{
int X;
int Y;
};
string Map[16385];
vector<int>V[16385];
queue<Struct>Queue;
int Dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,-1,-1,1,-1,-1,1};
int main(void)
{
register int Line,Column;
cin>>Line>>Column;
register int i,j;
for(i=1;i<=Line;i++)
{
cin>>Map[i];
Map[i]="@"+Map[i];
V[i].resize(Column+1);
}
int Sx,Sy,Ex,Ey;
while(cin>>Ex>>Ey>>Sx>>Sy)
{
if(!Ex&&!Ey&&!Sx&&!Sy)
{
break;
}
for(i=1;i<=Line;i++)
{
for(j=1;j<=Column;j++)
{
V[i][j]=0x3f3f3f3f;
}
}
V[Sx][Sy]=0;
Queue.push(Struct{Sx,Sy});
while(!Queue.empty())
{
register Struct Top;
Top=Queue.front();
Queue.pop();
for(i=0;i<4;i++)
{
register int Dx,Dy;
Dx=Top.X+Dir[i][0];
Dy=Top.Y+Dir[i][1];
if(Dx>0&&Dy>0&&Dx<=Line&&Dy<=Column&&V[Dx][Dy]==0x3f3f3f3f&&Map[Dx][Dy]=='O')
{
V[Dx][Dy]=V[Top.X][Top.Y]+1;
Queue.push(Struct{Dx,Dy});
}
}
}
register int Ans;
Ans=V[Ex][Ey];
for(i=0;i<8;i++)
{
register int Dx,Dy;
Dx=Ex+Dir[i][0];
Dy=Ey+Dir[i][1];
while(Dx>0&&Dy>0&&Dx<=Line&&Dy<=Column&&Map[Dx][Dy]=='O')
{
Ans=min(Ans,V[Dx][Dy]);
Dx=Dx+Dir[i][0];
Dy=Dy+Dir[i][1];
}
}
if(Ans==0x3f3f3f3f)
{
cout<<"Poor Harry"<<endl;
continue;
}
cout<<Ans<<endl;
}
return 0;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!