AOJ 1214 Walking Ant
問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1214。
antが自分の巣に帰る最短距離を求める。四方向に一つ進むのに1timeかかる。初期の体力が6で1timeごとに1ずつ減っていく、食べ物のマスを通ると体力が6になる。
解法
食べ物は2回以上通っても無駄だということが分かれば、BFSで簡単に解ける。
コード
int w, h; int d[8][8]; int dx[] = {0,-1,0,1}, dy[] = {-1,0,1,0}; int main(){ while(scanf("%d%d", &w, &h) && w+h){ int y, x; rep(i, h) rep(j, w){ scanf("%d", &d[i][j]); if(d[i][j] != 2) continue; y = i; x = j; } queue<pii> q; q.push(M(HP, M(y, x))); map<pi, bool> m; int t = 1; while(!q.empty()){ int qsize = (int)q.size(); rep(i, qsize){ pii now = q.front(); q.pop(); rep(j, 4){ int nt = now.F - 1, ny = now.S.F + dy[j], nx = now.S.S + dx[j]; if(nt == 0 || ny < 0 || nx < 0 || ny >= h || nx >= w || d[ny][nx] == 0) continue; if(!m.count(M(ny, nx)) && d[ny][nx] == 4){ nt = 6; m[M(ny, nx)] = true; }else if(d[ny][nx] == 3){ printf("%d\n", t); goto e; } q.push(M(nt, M(ny, nx))); } } t++; } puts("-1"); e:; } return 0; }
久々にまともな問題解いた感じ、最近簡単な問題やりすぎた。