O suprafaţă dreptunghiulară de înălţime N
şi lăţime M
unităţi trebuie acoperită perfect (placată) prin utilizarea unor plăci de formă dreptunghiulară de dimensiune 1 x P
sau P x 1
, unde P
este un număr natural nenul. Suprafaţa dată poate fi privită ca un caroiaj cu NxM
pătrăţele egale cu unitatea.
O placare corectă a suprafeţei iniţiale se memorează într-un fişier text folosind următoarele convenţii de codificare:
- pe prima linie se precizează dimensiunile
N
şiM
ale suprafeţei; - o placă dreptunghiulară de laţime
P
este codificată prin numărul naturalP
, iar o placă de înalţimeP
se codifică prin numărul întreg–P
; - convenim ca placa având ambele dimensiuni egale cu unitatea să se codifice cu valoarea
1
; - pe fiecare din cele
N
linii ale codificării se află câte un şir de valori întregi reprezentând, în ordine de la stânga la dreapta, codurile plăcilor care se găsesc amplasate începând de la respectiva linie; - codul
P
strict mai mare ca1
al unei placi orizontale apare o singură dată pe linia corespunzătoare pe care se află placa, iar codul–P
al unei placi verticale va apare o singură dată şi anume pe prima linie de la care placa respectivă este amplasată în jos pe o anumita coloană a suprafeţei; - dacă pe o anumită linie a suprafeţei nu există astfel de coduri de plăci, atunci pe respectiva linie din fişier este o singură valoare de
0
.
Folosind codificarea unei placări a suprafeţei iniţiale, se poate determina imaginea acestei placări sub forma unui tablou bidimensional A
, cu N
linii şi M
coloane, unde A
ij
= valoarea absolută a codului plăcii care se suprapune peste pătrăţelul de pe linia i
şi coloana j
.
Cerinţă
Cunoscând codificarea unei placări corecte a suprafeţei date să se obţină imaginea acestei placări (matricea de valori corespunzătoare codificării suprafeţei).
Date de intrare
Fișierul de intrare placare.in
are următoarea structură:
- pe prima linie valorile naturale
N M
, separate printr-un spaţiu, undeN
este înălţimea suprafeţei,M
este lăţimea suprafeţei. - pe fiecare din următoarele
N
linii se află un şir de valori întregi, separate prin câte un spaţiu, reprezentând codificarea respectivei linii a placării.
Date de ieșire
În fișierul de ieșire placare.out
se va tipări tabloul bidimensional ce reprezintă imaginea placării, compus din N
linii, pe fiecare dintre ele aflându-se M
valori naturale separate prin câte un spaţiu, cu semnificaţia din enunţ.
Restricții și precizări
1 ≤ N, M ≤ 300
- pentru 80% din teste,
1 ≤ N, M ≤ 100
- dimensiunea
P
sau-P
a unei plăci este aleasă astfel încât acoperirea obţinută să nu depăşească înălţimeaN
sau latimeaM
a suprafeţei. - datele din fişierul de intrare sunt corecte în sensul că reprezintă codificarea unei acoperiri a zonei dreptunghiulare de dimensiuni
N
şiM
.
Exemplul 1
placare.in
4 4 -4 1 1 1 1 2 2 1 3
placare.out
4 1 1 1 4 1 2 2 4 2 2 1 4 3 3 3
Explicație
Valoarea -4
codifică o placă de înălţime 4
şi laţime 1
plasată începând din pătratul de coordonate (1,1)
şi pînă în pătratul de coordonate (4,1)
Valoarea 3
de pe ultima linie a codificării desemnează o placă de lăţime 3
şi înălţime 1
, plasată orizontal, începând din pătrăţelul de coordonate (4,2)
.
Exemplul 2
placare.in
3 2 -3 -2 0 1
placare.out
3 2 3 2 3 1
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 Placare:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("placare.in");
ofstream fout("placare.out");
short int n,m,a[301][301];
int main(){
fin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;)
if(a[i][j]==0){
int x;
fin>>x;
if(x==0)
continue;
if(x>0)
for(int k=1;k<=x;++k,++j)
a[i][j]=x;
else{
for(int k=1;k<=-x;++k)
a[i+k-1][j]=-x;
++j;
}
}
else
j++;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
fout<<a[i][j]<<" ";
fout<<endl;
}
}
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 #1097 Placare
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1097 Placare 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!