记录编号 333857 评测结果 AAAAAAAAAAAAAA
题目名称 [USACO Feb08] 流星雨 最终得分 100
用户昵称 Gravatartraceback 是否通过 通过
代码语言 C++ 运行时间 0.048 s
提交时间 2016-10-31 16:05:58 内存使用 0.70 MiB
显示代码纯文本
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> P;
const int inf=0x3f3f3f3f;
int killed[305][305];
int m;
int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
struct S {
	int x,y,t;
}tmp;
bool vis[305][305];
void bfs() {
	if (killed[0][0]==0) {
		printf("-1\n");
		return;
	}
	queue<S> que;
	que.push(tmp);
	vis[0][0]=true;
	while (!que.empty()) {
		S v=que.front();que.pop();
		if (killed[v.x][v.y]>=inf) {
			printf("%d\n",v.t);
			return;
		}
		for (int i=0;i<4;i++) {
			int x2=v.x+dx[i],y2=v.y+dy[i];
			if (x2>=0&&y2>=0&&!vis[x2][y2]&&killed[x2][y2]>v.t+1) {
				tmp.x=x2;
				tmp.y=y2;
				tmp.t=v.t+1;
				vis[x2][y2]=true;
				que.push(tmp);
			}
		}
	}
	printf("-1\n");
}
int main() {
	freopen("meteor.in","r",stdin);
	freopen("meteor.out","w",stdout);
	memset(killed,0x3f,sizeof(killed));
	scanf("%d",&m);
	int a,b,c;
	for (int i=1;i<=m;i++) {
		scanf("%d%d%d",&a,&b,&c);
		killed[a][b]=min(killed[a][b],c);
		for (int j=0;j<4;j++) {
			int x=a+dx[j],y=b+dy[j];
			if (x>=0&&y>=0) killed[x][y]=min(killed[x][y],c);
		}
	}
	bfs();
	return 0;
}