10pts求助,调了两小时了,救救孩子
查看原帖
10pts求助,调了两小时了,救救孩子
366254
dxy2020楼主2021/9/16 23:16

1AC 9WA

#include <bits/stdc++.h>
#define ri register int
using namespace std;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int gx[]={-1,0,1,1,1,0,-1,-1};
int gy[]={1,1,1,0,-1,-1,-1,0};
char a[5005][5005];
int mp[5005][5005],ans[5005][5005];
bool vis[5005][5005];
int n,m;
struct Node{
	int x,y;
}b,e,now,pos;
queue <Node> q;
inline bool check(int x,int y)
{
	if (x==e.x&&y==e.y)return 1;
	for (ri i=0;i<8;++i)
	{
		int xx=x+gx[i];
		int yy=y+gy[i];
		while (xx>=1&&xx<=n&&yy>=1&&yy<=m&&mp[xx][yy])
		{
			if (xx==e.x&&yy==e.y) return 1;
			xx+=gx[i];
			yy+=gy[i];
		}
	}	
	return 0;
}
inline int bfs()
{
	q.push(b);
	vis[b.x][b.y]=1;
	while (!q.empty())
	{
		now=q.front();
		q.pop();
		if (check(now.x,now.y))return ans[now.x][now.y];
		for (ri i=0;i<4;++i)
		{
			pos.x=now.x+dx[i];
			pos.y=now.y+dy[i];
			if (pos.x>=1&&pos.x<=n&&pos.y>=1&&pos.y<=m&&!vis[pos.x][pos.y]&&mp[pos.x][pos.y])
			{
				q.push(pos);
				vis[pos.x][pos.y]=1;
				ans[pos.x][pos.y]=ans[now.x][now.y]+1;
			}
		}
	}	
	return -1;
}
int main()
{
	
	scanf ("%d%d",&n,&m);
	for (ri i=1;i<=n;++i)
	{
		scanf ("%s",a[i]+1);
		for (ri j=1;j<=m;++j)
			mp[i][j]=a[i][j]=='X'?0:1;
	}
	while (~scanf ("%d%d%d%d",&b.x,&b.y,&e.x,&e.y)&&b.x&&b.y&&e.x&&e.y)
	{
		int x=bfs();
		if (x==-1)puts("Poor Harry");
		else printf ("%d\n",x);	
	}	
	return 0;
}

2021/9/16 23:16
加载中...