/* Tue Mar 16 17:41:16 JST 2004 */ #include #include #define WALL 0 #define EMPTY 1 #define START 2 #define HOLE 3 #define FOOD 4 int w, h; int area[10][10]; int distance[10][10][10]; int main() { int i, j, k, d, x, y, hp; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; int found; while (1) { scanf("%d %d", &w, &h); if (w == 0 && h == 0) { break; } for (i = 0; i <= h+1; i++) { for (j = 0; j <= w+1; j++) { if (i == 0 || j == 0 || i == h+1 || j == w+1) { area[i][j] = WALL; continue; } scanf("%d", &area[i][j]); for (hp = 0; hp < 7; hp++) { distance[i][j][hp] = INT_MAX; } if (area[i][j] == START) { distance[i][j][6] = 0; area[i][j] = EMPTY; } } } for (d = 0; ; d++) { found = 0; for (y = 1; y <= h; y++) { for (x = 1; x <= w; x++) { for (hp = 2; hp <= 6; hp++) { if (distance[y][x][hp] == d) { for (i = 0; i < 4; i++) { if (area[y+dy[i]][x+dx[i]] == FOOD) { if (distance[y+dy[i]][x+dx[i]][6] > d + 1) { found = 1; distance[y+dy[i]][x+dx[i]][6] = d + 1; } } if (area[y+dy[i]][x+dx[i]] == EMPTY) { if (distance[y+dy[i]][x+dx[i]][hp-1] > d + 1) { found = 1; distance[y+dy[i]][x+dx[i]][hp-1] = d + 1; } } if (area[y+dy[i]][x+dx[i]] == HOLE) { found = 1; goto quit; } } } } } } if (!found) { break; } } quit: #if 0 for (y = 1; y <= h; y++) { for (x = 1; x <= w; x++) { for (hp = 1; hp <= 6; hp++) { if (distance[y][x][hp] == INT_MAX) { printf("-,"); } else { printf("%d,", distance[y][x][hp]); } } printf(" "); } printf("\n"); } printf("=====\n"); #endif if (found) { printf("%d\n", d+1); } else { printf("-1\n"); } } return 0; } /* Tue Mar 16 18:31:47 JST 2004 */