// Labirinto - OBI2007 - Segunda fase #include #include #define NMAX 55 #define VERTICES 2510 int n, m; int nivel[VERTICES], vizinhos[VERTICES]; int fila[VERTICES*VERTICES], nvl[VERTICES*VERTICES]; int max[VERTICES]; int grafo[VERTICES][VERTICES]; int saida=MAXINT; int identificador (int a, int b) { return (b+(a-1)*m); } int rn (int nivelerrado) { while (nivelerrado>9) { nivelerrado-=10; } return nivelerrado; } int main() { int i, j; int idmax, atual, idv; int niv, nivv, niva; int ini, fim; scanf("%d %d", &n, &m); idmax=n*m; for (i=1; i<=idmax; i++) { for (j=1; j<=idmax; j++) { grafo[i][j]=0; } vizinhos[i]=0; max[i]=0; } for (i=1; i<=n; i++) { for (j=1; j<=m; j++) { atual=identificador(i, j); scanf("%d", &nivel[atual]); if (i-1>0) { idv=identificador(i-1, j); if (idv>0) { grafo[atual][vizinhos[atual]++]=idv; } } if (j-1>0) { idv=identificador(i, j-1); if (idv>0) { grafo[atual][vizinhos[atual]++]=idv; } } if (i+1<=n) { idv=identificador(i+1, j); if (idv<=idmax) { grafo[atual][vizinhos[atual]++]=idv; } } if (j+1<=m) { idv=identificador(i, j+1); if (idv<=idmax) { grafo[atual][vizinhos[atual]++]=idv; } } grafo[atual][vizinhos[atual]++]=atual; } } ini=0; fim=0; nvl[fim]=0; fila[fim++]=1; while (ini!=fim) { niv=nvl[ini]; if (nivmax[idv]) { nvl[fim]=niv+1; max[idv]=niv+1; fila[fim++]=idv; } } } } else { ini++; } } printf("%d\n", saida); return 0; }