Pagini recente » Cod sursa (job #2249705) | Cod sursa (job #1737838) | Cod sursa (job #2661282) | Cod sursa (job #2837481) | Cod sursa (job #1990937)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("alpin.in");
ofstream out("alpin.out");
typedef struct munte{
int i, j;//cooronate
munte * urm;
munte * prec;
}VARF;
int altit[1025][1025], dist[1025][1025], n;
int Dx[5] = {0, -1, 1, 0};
int Dy[5] = {-1, 0, 0, 1};
//altit- matricea altitudinilor initiala data
//dist - matricea cu lungimea drumurilor(nr. leg.)
//Dx si Dy array fol. pt. a det. vecinii
void citire(){
in>>n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
in >> altit[i][j];
}
//Memoizare este metoda prin care atunci cînd calculăm valoarea unui calcul
//scump, de obicei făcut într-o funcție, o păstrăm într-un tablou pentru a
//economisi timp în caz că acel calcul trebuie refăcut în viitor, respectiv
//atunci cînd funcția este chemată cu aceiași parametri.
bool incadrare(int lin, int col){
if(lin >= 1 && col >= 1 && lin <= n && col <= n)
return true;
return false;
}
int distanta(int lin, int col){
if(dist[lin][col] != 0)
return dist[lin][col];
for(int i = 0; i <= 3; i++){
int linVec = lin + Dy[i];
int colVec = col + Dx[i];//coord. vecinilor
if(incadrare(linVec, colVec)==true && altit[lin][col] > altit[linVec][colVec] && distanta(linVec, colVec) > dist[lin][col])
dist[lin][col] = distanta(linVec, colVec);//distanta actuala devine distanta maxima din vecini
}
dist[lin][col]++;//adaugam un drum, o leg intre nod si vecin
return dist[lin][col];
}
void drum(int lin, int col){
int stop = dist[lin][col];//nr drumurilor;
VARF * plec = new VARF;
plec -> i = lin;
plec -> j = col;
plec -> urm = NULL;
plec -> prec = NULL;
while(stop != 1){
for(int i = 0; i <= 3; i++){
int linVec = plec -> i + Dy[i];
int colVec = plec ->j + Dx[i];
if(dist[linVec][colVec] + 1 == dist[plec -> i][plec -> j]){
stop--;
VARF * vecin = new VARF;
vecin -> i = linVec;
vecin -> j = colVec;
vecin -> urm = NULL;
vecin -> prec = plec;
plec -> urm = vecin;
plec = plec -> urm;//trec mai departe
break;
}
}
}
while(plec != NULL){
out << plec -> i << ' ' << plec -> j << '\n';
plec = plec -> prec;
}
}
void alpin(){
int linMax = 1, colMax = 1;//tin minte max pentru a afisa drumul
//creez matricea distantelor
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++){
dist[i][j] = distanta(i, j);
if(dist[i][j] > dist[linMax][colMax] ){
linMax = i;
colMax = j;
}
}
out << dist[linMax][colMax] << '\n';
drum(linMax, colMax);
}
int main(){
citire();
alpin();
return 0;
}