AOJ 0230 Ninja Climbing
問題
解法
BFSで通った。もしビルの屋上を超えてしまっても屋上につくことはできる
心臓に悪いコード
cpp int n, b[2][128]; int rec1(int x, int y){ if(b[x][y+1] == 1) return rec1(x, y+1); return y; } int rec2(int x, int y){ if(b[x][y] == 2) return rec2(x, y-1); return y; } int main(){ while(scanf("%d", &n) && n){ rep(i, 2) rep(j, n) scanf("%d", &b[i][j]); queue<pii>q; q.push(MP(0, MP(0, 0))); q.push(MP(1, MP(0, 0))); map<pi, int>m; m[MP(0, 0)] = 1; m[MP(1, 0)] = 0; int res = -1; while(!q.empty()){ pii now = q.front(); q.pop(); if(b[now.F][now.S.F] == 1) now.S.F = rec1(now.F, now.S.F); else if(b[now.F][now.S.F] == 2) now.S.F = rec2(now.F, now.S.F); if(now.S.F >= n-1){ res = now.S.S; break; } rep(i, 3){ pii next = now; next.F = (next.F+1)%2; next.S.F += i; next.S.S++; if(m.count(MP(next.F, next.S.F))) continue; m[MP(next.F, next.S.F)] = next.S.S; q.push(next); } } if(res < 0) puts("NA"); else printf("%d\n", res); } return 0; }