#include #define MAX_N 2048 // massimo lato della regione tibetana #define MAX_DST 2*MAX_N // massima distanza possibile #define MAX_DEG 4 // massimo grado per ogni nodo (ogni nodo e' collegato al massimo a N,S,O,E) using namespace std; int Altezze[MAX_N][MAX_N]; int Visitato[MAX_N][MAX_N]; // vettore che segna se il nodo e' stato visitato int Distanza[MAX_N][MAX_N]; // vettore con tutte le distanze in ore dalla casella (1,1) int N, M; int min( int x, int y ) // funzione che calcola il minimo { return x < y ? x : y; } void leggi() { int a, b; cin >> N >> M; for (int i=0; i> Altezze[i][j]; Visitato[i][j] = 0; Distanza[i][j] = MAX_DST; } } } void dijkstra(int xsorgente, int ysorgente) // procedura che calcola tutte le distanze dalla sorgente con l'algoritmo di Dijkstra { int xmin, ymin, dmin, finito; Distanza[xsorgente][ysorgente]=0; // imposto la distanza della sorgente a 0, il resto e' gia' a infinito finito=0; while (!finito) { // finche' serve, ripeti: xmin=ymin=-1; dmin=MAX_DST; for (int i=0; i 0) Distanza[xmin-1][ymin] = min( Distanza[xmin-1][ymin], Distanza[xmin][ymin] + (Altezze[xmin][ymin]>=Altezze[xmin-1][ymin] ? 1 : 2) ); if (xmin < N-1) Distanza[xmin+1][ymin] = min( Distanza[xmin+1][ymin], Distanza[xmin][ymin] + (Altezze[xmin][ymin]>=Altezze[xmin+1][ymin] ? 1 : 2) ); if (ymin > 0) Distanza[xmin][ymin-1] = min( Distanza[xmin][ymin-1], Distanza[xmin][ymin] + (Altezze[xmin][ymin]>=Altezze[xmin][ymin-1] ? 1 : 2) ); if (ymin < M-1) Distanza[xmin][ymin+1] = min( Distanza[xmin][ymin+1], Distanza[xmin][ymin] + (Altezze[xmin][ymin]>=Altezze[xmin][ymin+1] ? 1 : 2) ); } } } int main() { leggi(); dijkstra(0,0); // calcolo tutte le distanze dall'inizio cout << Distanza[N-1][M-1] << endl; // stampo la distanza con il monastero return 0; }