求助大佬,我觉得这段代码思路没问题,但是0分,样例也过不了(悬赏关注)
查看原帖
求助大佬,我觉得这段代码思路没问题,但是0分,样例也过不了(悬赏关注)
895690
gghack_Nythix楼主2023/2/7 19:52

rt,没人回就再发了一个,之前的删了

#include <bits/stdc++.h>
#define int long long
#define maxx 350
using namespace std;
struct meteor{
	int x,y;
};
queue<meteor>q;
int ans[maxx][maxx],dh[maxx][maxx],dir[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
signed main(){
	int m,ansss = 1145141919;
	memset(ans,-1,sizeof(ans));
	memset(dh,0x7f,sizeof(dh));
	cin >> m;
	for(int i = 1;i <= m;++i){
		int x,y,t;
		cin >> x >> y >> t;
#define MINN(x,y,t) if(x >= 0 && y>= 0)dh[x][y] = min(dh[x][y],t);
		MINN(x,y,t);
		for(int y = 0;y < 4;++y){
			MINN(x+dir[y][0],y+dir[y][1],t);
		}
	}
	q.push(meteor{0,0});
	ans[0][0] = 0;
	while(!q.empty()){
		meteor reload = q.front();
		int rx = reload.x,ry = reload.y;
		q.pop();
		for(int i = 0;i < 4;++i){
			int fx = rx + dir[i][0],fy = ry + dir[i][1];
			if(fx < 0 || fy < 0 || fx > 305 || fy > 305|| ans[fx][fy] != -1 || ans[rx][ry] + 1 >= dh[fx][fy]){
				continue;
			}
			ans[fx][fy] = ans[rx][ry] + 1;
			q.push(meteor{fx,fy});
		}

	}
	for(int i = 0;i <= 305;++i){
		for(int j = 0;j <= 305;++j){
			if(dh[i][j] > 1000 && ans[i][j] != -1){
				ansss = min(ansss,ans[i][j]);
			}
		}
	}
	if(ansss == 1145141919){
		cout << -1;
	}
	else{
		cout << ansss;
	}
	return 0;
}
2023/2/7 19:52
加载中...