题解 洛谷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;
}
posted @ 2020-08-12 20:23  Bushuai_Tang  阅读(102)  评论(0编辑  收藏  举报