20分求助!
查看原帖
20分求助!
574215
OneLeft楼主2022/5/28 20:18
#include<bits/stdc++.h>
using namespace std;
long long n,m,xa[9]={0,-1,0,1,-1,1,-1,0,1},ya[9]={0,-1,-1,-1,0,0,1,1,1},xb[5]={0,-1,1,0,0},yb[5]={0,0,0,-1,1};
long long a,b,c,d,MAP[5005][5005],t,tx,ty;
char Map[5005][5005];
queue<long long>xx,yy,sum;
long long BFS(long long x,long long y)
{
	if(MAP[x][y]==2)return 0;
	xx.push(x);
	yy.push(y);
	sum.push(0);
	while(!xx.empty())
	{
		x=xx.front();
		y=yy.front();
		MAP[x][y]=1;
		for(int i=1;i<=4;i++)
		{
			tx=x+xb[i];
			ty=y+yb[i];
			if(MAP[tx][ty]==2)return sum.front()+1;
			else if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&Map[tx][ty]=='O'&&MAP[tx][ty]==0)
			{
				xx.push(x+xb[i]);
				yy.push(y+yb[i]);
				sum.push(sum.front()+1);
			}
		}
		xx.pop();
		yy.pop();
		sum.pop();
	}
	return -1;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		cin>>Map[i][j];
	for(;;)
	{
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			MAP[i][j]=0;
		while(!xx.empty())xx.pop();
		while(!yy.empty())yy.pop();
		while(!sum.empty())sum.pop();
		cin>>a>>b>>c>>d;
		if(a==0&&b==0&&c==0&&d==0)
			break;
		for(int i=1;i<=8;i++)
		{
			for(int x=a,y=b;;x+=xa[i],y+=ya[i])
			{
				if(x<1||x>n||y<1||y>m||Map[x][y]=='X')
					break;
				MAP[x][y]=2;
			}
		}
		t=BFS(c,d);
		if(t==-1)cout<<"Poor Harrn\n";
		else cout<<t<<"\n";
	}
	
	return 0;
}
2022/5/28 20:18
加载中...