蒟蒻玄关求调
查看原帖
蒟蒻玄关求调
996338
_radio_楼主2024/4/7 16:25

rt。WA最后一个点

#include<bits/stdc++.h>
using namespace std;
int h,w,n,qx,qy,zx,zy,bj[210][210],vis[310];
string s[210];
struct node{
	int x,y,val;
}a[310];
struct BFS{
	int x,y,cs;
};
vector<int> to[310];
int main(){
	cin>>h>>w;
	for(int i=1;i<=h;i++){
		cin>>s[i];
		s[i]=" "+s[i];
		for(int j=1;j<=w;j++)
			if(s[i][j]=='S') qx=i,qy=j;
			else if(s[i][j]=='T') zx=i,zy=j;
	}
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y>>a[i].val;
		bj[a[i].x][a[i].y]=i;
	}
	if(!bj[qx][qy]){
		cout<<"No";
		return 0;
	}
	a[n+1]=node{zx,zy,0};
	for(int i=1;i<=n;i++){
		queue<BFS> que;
		bool dd[210][210];
		memset(dd,0,sizeof(dd));
		que.push(BFS{a[i].x,a[i].y,0});
		while(!que.empty()){
			int x=que.front().x,y=que.front().y,cs=que.front().cs;
			if(bj[x][y]&&bj[x][y]!=i) to[i].push_back(bj[x][y]);
			if(x==zx&&y==zy) to[i].push_back(n+1);
			que.pop();
			if(x+1<=w&&s[x+1][y]!='#'&&cs<a[i].val&&!dd[x+1][y]) dd[x+1][y]=1,que.push(BFS{x+1,y,cs+1});
			if(x-1>=1&&s[x-1][y]!='#'&&cs<a[i].val&&!dd[x-1][y]) dd[x-1][y]=1,que.push(BFS{x-1,y,cs+1});
			if(y+1<=h&&s[x][y+1]!='#'&&cs<a[i].val&&!dd[x][y+1]) dd[x][y+1]=1,que.push(BFS{x,y+1,cs+1});
			if(y-1>=1&&s[x][y-1]!='#'&&cs<a[i].val&&!dd[x][y-1]) dd[x][y-1]=1,que.push(BFS{x,y-1,cs+1});
		}
	}
	queue<int> que;
	que.push(bj[qx][qy]);
	vis[bj[qx][qy]]=1;
	while(!que.empty()){
		int x=que.front();
		que.pop();
		for(auto &i:to[x])
			if(!vis[i]){
				vis[i]=1;
				que.push(i);
			}
	}
	cout<<(vis[n+1]?"Yes":"No");
	return 0;
}
2024/4/7 16:25
加载中...