Cod sursa(job #1990937)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 14 iunie 2017 12:49:49
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.62 kb
#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;
}