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