92分,哪里错了?
查看原帖
92分,哪里错了?
1505045
AlbertX楼主2025/8/30 19:07
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

struct Coord{
	int x,y;
};
queue<Coord> Q;
const int MAXN=500;
int ans[MAXN][MAXN],death[MAXN][MAXN];
int walk[4][2]={{0,1},{1,0},{-1,0},{0,-1}};

int main(){
	memset(ans,-1,sizeof(ans));
	memset(death,0x3f3f3f3f,sizeof(death));
	int m;
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int x,y,t;
		scanf("%d%d%d",&x,&y,&t);
		#define MIN(x,y,z) if(x>=0&&y>=0) death[x][y]=min(death[x][y],t)
		MIN(x,y,t);
		for(int k=0;k<4;k++)
			MIN(x+walk[k][0],y+walk[k][1],t);
	}
	Q.push({0,0});
	ans[0][0]=0;
	while(!Q.empty()){
		Coord u=Q.front();
		Q.pop();
		for(int k=0;k<4;k++){
			int x=u.x+walk[k][0],y=u.y+walk[k][1];
			if(x<0||y<0||ans[x][y]!=-1||ans[u.x][u.y]+1>=death[x][y]||x>300||y>300)
				continue;
			ans[x][y]=ans[u.x][u.y]+1;
			Q.push({x,y});
		}
	}
	int Ans=100000;
	for(int i=0;i<=305;i++)
		for(int j=0;j<=305;j++)
			if(death[i][j]>1000&&ans[i][j]!=-1)
				Ans=min(Ans,ans[i][j]);
	if(Ans==100000) printf("-1");
	else printf("%d",Ans);
	return 0;
}

如果这道题过了,就是我的第200题。

2025/8/30 19:07
加载中...