这题为啥可以这样
查看原帖
这题为啥可以这样
537046
大眼仔Happy楼主2024/4/7 21:28

rt,没什么实力

不知道为啥 SPFA 可以过

#include<bits/stdc++.h>
using namespace std;
const int N=305;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
#define pii pair<int,int>
#define mp make_pair
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int h,w,n,sx,sy,ex,ey;
char s[N][N];bool vis[N][N];
int a[N][N],dis[N][N];
queue<pii>q;
int main(){
	h=read();w=read();
	for(int i=1;i<=h;i++)
	{
		scanf("%s",s[i]+1);
		for(int j=1;j<=w;j++)
		{
			if(s[i][j]=='S')sx=i,sy=j;
			if(s[i][j]=='T')ex=i,ey=j;
		}
	}
	n=read();
	for(int i=1,x,y;i<=n;i++)x=read(),y=read(),a[x][y]=read();
	dis[sx][sy]=a[sx][sy];q.push(mp(sx,sy));
	while(!q.empty())
	{
		pii t=q.front();q.pop();
		int x=t.first,y=t.second;vis[x][y]=0;
		if(!dis[x][y])continue;
		for(int i=0;i<4;i++)
		{
			int xx=x+dx[i],yy=y+dy[i];
			if(xx<1||yy<1||xx>h||yy>w||s[xx][yy]=='#')continue;
			int ww=max(a[xx][yy],dis[x][y]-1);
			if(dis[xx][yy]<ww)
			{
				dis[xx][yy]=ww;
				if(!vis[xx][yy])vis[xx][yy]=1,q.push(mp(xx,yy));
			}
			if(xx==ex&&yy==ey)return printf("Yes"),0;
		}
	}
	printf("No");
	return 0;
}

2024/4/7 21:28
加载中...