警示后人:如果你 WA 5 9 12 14
查看原帖
警示后人:如果你 WA 5 9 12 14
449457
IYSY2009I楼主2023/8/4 21:53
  1. 所有格子的流星降落时间设为无穷大,意为该格子安全。
  2. 同一个格子可能被流星砸多次,需要对时间取 min⁡\min(这就是为什么要注意第一条),而且上下左右四个格子都需要取 min⁡\min。

下面给出我的代码,带注释的行就是上面提到的需要注意的点,把所有注释取消掉交上就能满分。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int mp[305][305];
bool vis[305][305];
int cnt;
int x[400005];
int y[400005];
int t[400005];
queue<pair<int,int> > q;
int main(){
	int m;
	scanf("%d",&m);
//	t[0]=1e9;
	x[0]=304,y[0]=304;
//	for(int i=1;i<=4*m;i++)
//		t[i]=1e9;
	for(int i=1;i<=m;i++){
		cnt++;
		scanf("%d%d%d",&x[cnt],&y[cnt],&t[cnt]);
//		if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
		int id=cnt;
		if(x[cnt]>0){
			cnt++;
			x[cnt]=x[id]-1;
			y[cnt]=y[id];
			t[cnt]=t[id];
//			if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
		}
		if(y[cnt]>0){
			cnt++;
			x[cnt]=x[id];
			y[cnt]=y[id]-1;
			t[cnt]=t[id];
//			if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
		}
		cnt++;
		x[cnt]=x[id]+1;
		y[cnt]=y[id];
		t[cnt]=t[id];
//		if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
		cnt++;
		x[cnt]=x[id];
		y[cnt]=y[id]+1;
		t[cnt]=t[id];
//		if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
	}
	if(!mp[0][0]){
		printf("0");
		return 0;
	}
	if(!t[mp[0][0]]||!t[mp[0][1]]||!t[mp[1][0]]){
		printf("-1");
		return 0;
	}
	q.push(make_pair(mp[0][0],0));
	while(!q.empty()){
		pair<int,int> p=q.front();
		q.pop();
		if(vis[x[p.first]][y[p.first]]) continue;
		vis[x[p.first]][y[p.first]]=1;
		if(!mp[x[p.first]][y[p.first]]){
			printf("%d",p.second);
			return 0;
		}
		if(x[p.first]>0&&t[mp[x[p.first]-1][y[p.first]]]>p.second+1) q.push(make_pair(mp[x[p.first]-1][y[p.first]],p.second+1));
		if(t[mp[x[p.first]+1][y[p.first]]]>p.second+1) q.push(make_pair(mp[x[p.first]+1][y[p.first]],p.second+1));
		if(y[p.first]>0&&t[mp[x[p.first]][y[p.first]-1]]>p.second+1) q.push(make_pair(mp[x[p.first]][y[p.first]-1],p.second+1));
		if(t[mp[x[p.first]][y[p.first]+1]]>p.second+1) q.push(make_pair(mp[x[p.first]][y[p.first]+1],p.second+1));
	}
	printf("-1");
	return 0;
} 
2023/8/4 21:53
加载中...