Enunț
Se consideră o matrice dreptunghiulară cu m
linii şi n
coloane, cu valori naturale. Traversăm matricea pornind de la colţul stânga-sus la colţul dreapta-jos. O traversare constă din mai multe deplasări. La fiecare deplasare se execută un salt pe orizontală şi un pas pe verticală. Un salt înseamnă că putem trece de la o celulă la oricare alta aflată pe aceeaşi linie, iar un pas înseamnă că putem trece de la o celulă la celula aflată imediat sub ea. Excepţie face ultima deplasare (cea în care ne aflăm pe ultima linie), când vom face doar un salt pentru a ajunge în colţul dreapta-jos, dar nu vom mai face şi pasul corespunzător. Astfel traversarea va consta din vizitarea a 2m
celule.
Cerinţă
Scrieţi un program care să determine suma minimă care se poate obţine pentru o astfel de traversare.
Date de intrare
Fișierul de intrare lacusta.in
conține conţine pe prima linie două numere naturale separate printr-un spaţiu m n
, reprezentând numărul de linii şi respectiv numărul de coloane ale matricei. Pe următoarele m linii este descrisă matricea, câte n numere pe fiecare linie, separate prin câte un spaţiu.
Date de ieșire
Fișierul de ieșire lacusta.out
va conține pe prima linie suma minimă găsită.
Restricții și precizări
1≤ m, n ≤ 100
- Valorile elementelor matricei sunt numere întregi din intervalul
[1,255]
Exemplu
lacusta.in
4 5 3 4 5 7 9 6 6 3 4 4 6 3 3 9 6 6 5 3 8 2
lacusta.out
28
Explicație
Drumul este: (1,1)->(1,3)->(2,3)->(2,2)->(3,2)->(3,3)->(4,3)->(4,5)
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Lacusta:
#include <stdio.h>
#define M 100
int main()
{
FILE *fi,*fo;
unsigned int a[M][M],b[M][M],m,n,i,j,min1,min2,jmin;
fi=fopen("lacusta.in", "rt");
fscanf(fi,"%u %u", &m, &n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
fscanf(fi,"%u",&a[i][j]);
fclose(fi);
b[1][0]=32000;
for(i=1; i<n; i++)
b[1][i]=a[0][0]+a[0][i]+a[1][i];
for(i=1; i<m-1; i++)
{
if(b[i][0]<=b[i][1])
{
min1=b[i][0];
min2=b[i][1];
jmin=0;
}
else
{
min1=b[i][1];
min2=b[i][0];
jmin=1;
}
for(j=2; j<n; j++)
if(b[i][j]<min1)
{
min2=min1;
min1=b[i][j];
jmin=j;
}
else
if(b[i][j]<min2)
min2=b[i][j];
for(j=0; j<n; j++)
if(j!=jmin)
b[i+1][j]=min1+a[i][j]+a[i+1][j];
else
b[i+1][j]=a[i][j]+a[i+1][j]+min2;
}
min1=b[m-1][0];
for (j=1; j<n; j++)
if(b[m-1][j]<min1) min1=b[m-1][j];
fo=fopen("lacusta.out", "wt");
fprintf(fo,"%u\n", min1+a[m-1][n-1]);
fclose(fo);
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1747 Lacusta
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1747 Lacusta de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!