online: 12; azi: 809; total: 52815 Manual clasa a xi a - Tehnici de programare - Metoda greedy

Manual clasa a Xi a

Tehnici de programare

Metoda greedy

Un turist trebuie să străbată un traseu de munte. Pe hartă, zona prin care trebuie să treacă are o formă dreptunghiulară, care este împărțită, prin caroiaje, în subzone, care au fiecare o anumită înălțime. Zona prin care trece turistul poate fi reprezentată printr-o matrice ale cărei elemente memorează înălțimea fiecărei subzone. Turistul porneşte din sud, din orice subzonă de pe hartă, şi trebuie să ajungă în nord, în orice subzonă de pe hartă, astfel încât să urce cât mai puțin pe intreg traseul. El poate trece dintr-o zonă în alta, numai mergând în direcțiile: Est, Nord-est, Nord, Nord-Vest şi Vest. Datele de intrare sunt dimensiunile matricei şi matricea înălțimilor şi se vor citi din fişier .
# include < iostream >
# include < fstream >
using namespace std ;
const int max_dim = 100 ;
int main () {
ifstream fin ( "date_intrare.txt" ) ;
int n, m;
fin >> n >> m;
int harta[ max_dim ][ max_dim ];
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < m; j++) {
fin >> harta[i][j];
}
}
fin. close ();
int dp [ max_dim ][ max_dim ] = { 0 };
for ( int j = 0 ; j < m; j++) {
dp [ 0 ][j] = harta[ 0 ][j];
}
for ( int i = 1 ; i < n; i++) {
for ( int j = 0 ; j < m; j++) {
int min_urcare = INT_MAX;
int dx[] = { -1 , 0 , 1 , -1 , 1 };
int dy [] = { -1 , -1 , -1 , 0 , 0 };
for ( int k = 0 ; k < 5 ; k++) {
int prev_i = i + dy [k];
int prev_j = j + dx[k];
if ( prev_i >= 0 && prev_j >= 0 && prev_j < m) {
min_urcare = min ( min_urcare , dp [ prev_i ][ prev_j ] + harta[i][j] - harta[ prev_i ][ prev_j ]);
}
}
dp [i][j] = min_urcare ;
}
}
int min_total = INT_MAX;
for ( int j = 0 ; j < m; j++) {
min_total = min ( min_total , dp [n - 1 ][j]);
}
cout << "Urcare minima: " << min_total << endl ;
return 0 ;
}

Pentru a rula acest program, creați un fișier numit "date_intrare.txt" care conține datele de intrare în următoarea ordine:
Un exemplu de date de intrare în "date_intrare.txt":
4 5
1 4 5 7 9
4 5 6 2 4
2 4 1 5 8
1 3 2 1 3