题解 洛谷P3818 【小A和uim之大逃离 II】
\(Sol\)
显然,这是一道\(BFS\)题。
但是,蒟蒻我调了好几次呢!结果发现少打了一个字符
每次我们有\(4\) \(or\) \(5\)种选择。
如果曾经没有用过魔液,我们可以使用魔液。
否则,我们就只能向上下左右四个方向走。
所以我们要记录的参数有:
- 横坐标
- 纵坐标
- 已用步数
- 是否用过魔液
其他细节请自己处理下吧...
\(Code\)
#include<bits/stdc++.h>
using namespace std;
struct Struct
{
int X;
int Y;
int Step;
bool Use;
};
int Line,Column;
int DeltaX,DeltaY;
char Map[1001][1001];
bool Visit[1001][1001][2];
int Dir[4][2]={1,0,0,1,-1,0,0,-1};
int main(void)
{
register int i,j;
cin>>Line>>Column;
cin>>DeltaX>>DeltaY;
for(i=1;i<=Line;i++)
{
for(j=1;j<=Column;j++)
{
cin>>Map[i][j];
}
}
register queue<Struct>Queue;
while(!Queue.empty())
{
Queue.pop();
}
Queue.push({1,1,0,false});
Visit[1][1][0]=true;
while(!Queue.empty())
{
register Struct Top;
Top=Queue.front();
Queue.pop();
if(Top.X==Line&&Top.Y==Column)
{
cout<<Top.Step<<endl;
return 0;
}
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&&!Visit[Dx][Dy]&&Map[Dx][Dy]=='.')
{
Visit[Dx][Dy][Top.Use]=true;
Queue.push({Dx,Dy,Top.Step+1,Top.Use});
}
}
register int Dx,Dy;
Dx=Top.X+DeltaX;
Dy=Top.Y+DeltaY;
if(Dx>0&&Dy>0&&Dx<=Line&&Dy<=Column&&Top.Use&&!Visit[Dx][Dy])
{
Visit[Dx][Dy][Top.Use]=true;
Queue.push({Dx,Dy,Top.Step+1,!Top.Use});
}
}
cout<<-1<<endl;
return 0;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!