88分求调
查看原帖
88分求调
1047309
return_second楼主2024/7/17 19:17
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n,m,dis[1005][1005],tx,ty,fx,fy;
char a[1005][1005];
bool vis[1005][1005],flag[1005][1005];
const int f[][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};
struct node
{
	int x,y;
};
void bfs(int x,int y)
{
	memset(vis,false,sizeof(vis));
	memset(dis,-1,sizeof(dis));
	memset(flag,false,sizeof(flag));
	for(int i=0;i<8;i++)
	{
		int nx=fx,ny=fy;
		while(1<=nx&&nx<=n&&1<=ny&&ny<=m&&a[nx][ny]=='O')
		{
			flag[nx][ny]=true;
			nx+=f[i][0];
			ny+=f[i][1];
		}
	}
	queue<node>q;
	q.push({x,y});
	vis[x][y]=true;
	dis[x][y]=0;
	while(!q.empty())
	{
		node now=q.front();
		q.pop();
		if(flag[now.x][now.y])
		{
			cout<<dis[now.x][now.y]<<endl;
			return;
		}
		for(int i=0;i<4;i++)
		{
			int nx=now.x+f[i][0],ny=now.y+f[i][1];
			if(nx<1||nx>n||ny<1||ny>m)continue;
			if(a[nx][ny]=='X')continue;
			if(vis[nx][ny])continue;
			vis[nx][ny]=true;
			dis[nx][ny]=dis[now.x][now.y]+1;
			q.push({nx,ny});
		}
	}
	puts("Poor Harry");
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	while(true)
	{
		cin>>fx>>fy>>tx>>ty;
		if(tx==0&&ty==0&&fx==0&&fy==0)break;
		bfs(tx,ty);
	}
	return 0;
}
2024/7/17 19:17
加载中...