Pe o foaie de matematică cu N
pătrățele orizontale (pe aceeași linie) și M
pătrățele verticale (pe aceeași coloană), Alex a pictat nave. Definim o navă linie (L) ca un set de pătrățele umbrite, consecutive pe un rând al foii de matematică. Definim o navă coloană (C) ca un set de pătrățele umbrite, consecutive pe o coloană a foii de matematică. Dimensiunea unei nave este egală cu numărul de pătrățele din care este formată. O navă formată dintr-un singur pătrățel nu este nici linie, nici coloană. Navele pot avea diferite dimensiuni. Două nave diferite nu se ating pe laturi sau colțuri, nu se suprapun și nu au pătrățele comune. Pe foaia de matematică sunt pictate doar nave de cele 3 tipuri: navă linie (L), navă coloană (C) sau navă pătrățel.
Cerința
Cunoscându-se M
, N
și pictura lui Alex, scrieți un program care să determine:
- Numărul de nave formate doar dintr-un singur pătrățel;
- Numărul de nave linie și numărul de nave coloană, precum și dimensiunile acestora.
Date de intrare
Fişierul de intrare boats.in
conţine pe prima linie un număr natural P
reprezentând cerinţa care trebuie să fie rezolvată (1 sau 2). Pe cea de a doua linie fișierul conține două numere întregi, separate printr-un spațiu, reprezentând valorile M și N din enunț. Pe următoarele M
linii se află câte N
valori egale cu 0 sau 1, separate prin câte un spațiu (0 – dacă pătrățelul nu face parte dintr-o navă, 1 – în cazul în care pătrățelul este o parte a unei nave).
Date de ieșire
Dacă cerința este P=1
, atunci pe prima linie a fișierului boats.out
va fi scris un număr natural reprezentând numărul de nave formate dintr-un singur pătrățel.
Dacă cerința este P=2
, atunci în fișierul boats.out
vor fi scrise, pe câte o linie, separate prin câte un spațiu, trei valori: caracterul L
urmat de numerele d
și c
, în ordine crescătoare după valoarea d
, unde d
– reprezintă lungimea navei (numărul de pătrățele) iar c
– numărul de nave linie de lungime d
. Apoi, pe fiecare dintre liniile următoare vor fi scrise, separate prin câte un spațiu, caracterul C
urmat de două numere: d
și c
, în ordine crescătoare după d
, unde d
– reprezintă lungimea navei (numărul de pătrățele) și c
– numărul de nave coloană de lungime d
.
Restricții și precizări
2 ≤ M ≤ 1000
;2 ≤ N ≤ 1000
- Se garantează existența a cel puțin unei nave.
- Pentru rezolvarea corectă a primei cerinţe se va acorda 20% din punctaj, iar pentru rezolvarea corectă a celei de a doua cerințe se va acorda 80% din punctaj.
Exemplul 1
boats.in
1 12 12 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
boats.out
1
Explicație
Se rezolvă doar cerința 1. Există o singură navă formatată dintr-un singur pătrățel, cea de la coordonatele 3 8
.
Exemplul 2
boats.in
2 12 12 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
boats.out
L 2 1 L 5 1 L 6 1 C 3 2 C 4 1
Explicație
Se rezolvă doar cerința 2. Există 3
nave linie: o navă linie de lungime 2
, o navă linie de lungime 5
și o navă linie de lungime 6
. Există 3
nave coloană: 2
nave coloană de lungime 3
, o navă coloană de lungime 4
.
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 boats:
program boats;
var n,m,p:integer;
oriz,vert:array[1..1002] of integer;
a:array[1..1003,1..1003] of integer;
f,g:text;
procedure citire;
var i,j:integer;
begin
readln(f,p,n,m);
for i:=1 to n do
for j:=1 to m do
read(f,a[i,j]);
end;
procedure sol;
var i,j,nr,k:integer;
begin
for i:=1 to m do
oriz[i]:=0;
for i:=1 to n do
vert[i]:=0;
for i:=1 to n do
begin
j:=1;
while j<=m do
begin
if a[i,j]<>0 then
begin
nr:=1;
if a[i+1,j]=0 then
begin
j:=j+1;
while a[i,j]=1 do
begin a[i,j]:=0; j:=j+1;nr:=nr+1;end;
inc(oriz[nr]);dec(j);
end
else
begin
k:=i+1;
while a[k,j]=1 do
begin a[k,j]:=0; inc(k);inc(nr);end;
inc(vert[nr]);
end;
end;
j:=j+1;
end;
end;
if p=1 then write(g,oriz[1])
else
begin
for i:=2 to m do
if oriz[i]<>0 then writeln(g,'L',' ',i,' ',oriz[i]);
for i:=2 to n do
if vert[i]<>0 then writeln(g,'C',' ',i,' ',vert[i]);
end;
end;
Begin
assign (f,'boats.in');
reset(f);
assign (g,'boats.out');
rewrite(g);
citire;
sol;
close(f);
close(g);
end.
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 #2066 boats
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2066 boats 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!