Peking University Online Judge 3669 Meteor Shower

今回は300×300の範囲から脱出してもOKだと気付かず。
問題文はちゃんと読まなきゃダメですね(いや絶対書き方悪いって)

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
static const int MAX_H = 300;
static const int MAX_W = 300;
static const int INF = 1 << 30;
typedef pair<int, int> P;

int dy[] = {1, 0, -1, 0};
int dx[] = {0, 1, 0, -1};

int M;
int field[MAX_H + 2][MAX_W + 2];
int dist[MAX_H + 1][MAX_W + 1];
bool visited[MAX_H + 1][MAX_W + 1];

int bfs(int y, int x){
	if(field[y][x] == INF) return 0;
	fill(visited[0], visited[MAX_H + 1], false);
	fill(dist[0], dist[MAX_H + 1], INF);
	queue<P> qa;
	qa.push(P(y, x));
	visited[y][x] = true;
	dist[y][x] = 0;
	while(!qa.empty()){
		P p = qa.front(); qa.pop();
		int cy = p.first;
		int cx = p.second;
		for(int i = 0; i < 4; i++){
			int ny = cy + dy[i];
			int nx = cx + dx[i];
			if(ny < 0 || nx < 0) continue;
			if(field[ny][nx] == INF) return dist[cy][cx] + 1;
			if(!visited[ny][nx] && field[ny][nx] > dist[cy][cx] + 1){
				dist[ny][nx] = dist[cy][cx] + 1;
				visited[ny][nx] = true;
				qa.push(P(ny, nx));
			}
		}
	}
	return -1;
}

int main(){
	scanf("%d", &M);
	fill(field[0], field[MAX_H + 2], INF);
	for(int i = 0; i < M; i++){
		int X, Y, T;
		scanf("%d %d %d", &X, &Y, &T);
		field[Y][X] = min(field[Y][X], T);
		for(int j = 0; j < 4; j++){
			int ny = Y + dy[j];
			int nx = X + dx[j];
			if(ny < 0 || nx < 0) continue;
			field[ny][nx] = min(field[ny][nx], T);
		}
	}
	printf("%d\n", bfs(0, 0));
	return 0;
}