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; }