În această poveste este vorba despre o casă cu mai multe camere. O cameră are forma unui pătrat de latură 1
. Dacă două camere au un perete comun, atunci se poate trece dintr-o cameră în alta. Casa nu are neapărat formă dreptunghiulară.
O asemenea casă poate fi descrisă în povestea noastră în două moduri:
- prin matricea minimală: o matrice cu elemente
0
şi1
în care existăN
valori egale cu1
, ce corespund camerelor, iar prima linie, ultima linie, prima coloană şi ultima coloană au cel puţin un element egal cu1
. - prin construcţie: un şir de
N-1
perechi(a[i], b[i]) 1≤i<n
în carea[i]
din{1,2,…,i}
şib[i]
din{N, S, E, V}
. Camerele vor fi numerotate de la1
lan
. Perechea(a[i], b[i])
precizează poziţia camereii+1
faţă de cameraa[i]
:E
înseamnă la dreapta (est),N
deasupra (nord),V
la stânga (vest),S
dedesubt (sud). Observaţi că pentru prima cameră nu există nicio precizare!
De exemplu, casa de mai sus poate fi descrisă de şirul (1 E) (2 E) (2 S) (3 S)
, adică a doua cameră e “lipită” la est de prima cameră, următoarea (a treia) la est de camera 2, a patra la sud de camera 2, iar ultima la sud de camera 3.
Cerința
- Se dă descrierea unei case prin construcţie şi se cere descrierea acesteia prin matricea minimală.
- Se dă descrierea unei case prin matricea minimală şi se cere descrierea acesteia prin construcţie.
Date de intrare
Fişierul casa.in
conţine:
- Pe prima linie un număr natural
p
reprezentând cerinţa care trebuie rezolvată. Pentru toate testele de intrare, numărulp
poate avea valoarea1
sau2
. - Dacă valoarea lui
p
este1
atunci liniile următoare conţin descrierea unei case prin construcţie astfel: pe linia a doua un număr naturalN
reprezentând numărul de camere ale casei, iar pe fiecare din următoareleN-1
linii câte două valori separate prin câte un spaţiu – un număr natural şi un caracter, cu semnificaţia de mai sus. - Dacă valoarea lui
p
este2
atunci liniile următoare conţin descrierea unei case prin matrice minimală astfel: pe linia a doua două numere naturale nenuleM
,N
reprezentând dimensiunile matricei, iar pe următoareleM
linii câteN
numere0
sau1
separate prin câte un spaţiu.
Date de ieșire
Dacă valoarea lui p
este 1
atunci se va rezolva numai cerinţa 1
. În acest caz fişierul casa.out
va conţine pe prima linie două numere naturale M
şi N
, separate prin câte un singur spaţiu reprezentând numărul de linii respectiv numărul de coloane ale matricei minimale, iar pe următoarele M
linii câte N
valori 0
sau 1
separate prin câte un singur spaţiu.
Dacă valoarea lui p
este 2
atunci se va rezolva numai cerinţa 2
. În acest caz fişierul casa.out
va conţine pe prima linie două numere naturale Nr
şi C
separate printr-un singur spaţiu. Nr
reprezintă numărul de camere, iar C
poziţia camerei 1
(cel mai mic număr de ordine al unei coloane care conţine valoarea 1
în prima linie). Următoarele Nr-1
linii vor conţine fiecare câte două valori separate printr-un singur spaţiu, reprezentând descrierea unei case prin construcţie conform precizărilor din enunţ. Coloanele vor fi numerotate începând de la 1
, iar dacă există mai multe soluţii va fi afişată cea mai mică în ordine lexicografică: perechea (k, l)
va fi afişată înaintea perechii (k’, l’)
dacă k < k’
sau dacă k = k’
şi l < l’
(adică E < N < S < V
).
Restricții și precizări
- Matricea minimală a unei case are maximum
100000
elemente.
Exemplu
casa.in
1 5 1 E 2 E 2 S 3 S
casa.out
2 3 1 1 1 0 1 1
Exemplu
casa.in
2 2 3 1 1 1 1 0 1
casa.out
5 1 1 E 1 S 2 E 4 S
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 Casa:
// Casa O(m*n)
#include <fstream>
using namespace std;
#define M 100001
int p[M][4],t[M];
int main()
{ ifstream fi("casa.in"); ofstream fo("casa.out");
int a[M],m,n,i,j,k,v,nc,op; char c[M],pct[7]="xENSV";
fi>>op;
if (op==1)
{ fi>>nc;
for (i=1;i<nc;i++) fi>>a[i]>>c[i];
int max_e=0,max_v=0,max_n=0,max_s=0;
for (i=1;i<=nc;i++)
{ for(j=0;j<4;j++) p[i+1][j]=p[a[i]][j];
switch(c[i])
{ case 'N':p[i+1][2]--; p[i+1][1]++; if(p[i+1][1]>max_n) max_n=p[i+1][1]; break;
case 'S':p[i+1][1]--; p[i+1][2]++; if(p[i+1][2]>max_s) max_s=p[i+1][2]; break;
case 'E':p[i+1][3]--; p[i+1][0]++; if(p[i+1][0]>max_e) max_e=p[i+1][0]; break;
case 'V':p[i+1][0]--; p[i+1][3]++; if(p[i+1][3]>max_v) max_v=p[i+1][3]; break;}
}
m=max_n+max_s+1; n=max_e+max_v+1;
fo<<m<<" "<<n<<"\n";
p[1][1]=max_n+1; p[1][2]=max_v+1;
for (i=1;i<nc;i++)
{ switch(c[i])
{ case 'N':p[i+1][1]=p[a[i]][1]-1; p[i+1][2]=p[a[i]][2]; break;
case 'S':p[i+1][1]=p[a[i]][1]+1; p[i+1][2]=p[a[i]][2]; break;
case 'E':p[i+1][1]=p[a[i]][1]; p[i+1][2]=p[a[i]][2]+1; break;
case 'V':p[i+1][1]=p[a[i]][1]; p[i+1][2]=p[a[i]][2]-1; break;}
}
for (i=1;i<=nc;i++) t[(p[i][1]-1)*n+p[i][2]-1]=1;
for (i=1;i<=m;i++)
{ for (j=1;j<=n;j++) fo<<t[(i-1)*n+j-1]<<" "; fo<<"\n"; }
}
if (op==2)
{ fi>>m>>n; nc=0; k=0;
for (j=1;j<=n;j++)
{ fi>>t[j-1]; nc+=t[j-1]; if (k==0 && t[j-1]==1) k=j; }
for (i=2;i<=m;i++)
for (j=1;j<=n;j++)
{ fi>>t[(i-1)*n+j-1]; nc+=t[(i-1)*n+j-1];}
fo<<nc<<" "<<k<<"\n";
p[1][0]=1; p[1][1]=k; t[k-1]=2; k=1; v=1;
while (v<nc)
{ i=p[k][0]; j=p[k][1];
if (j<n && t[(i-1)*n+j]==1) { v++; t[(i-1)*n+j]=v+1; p[v][0]=i; p[v][1]=j+1; p[v][2]=1; }
if (i>1 && t[(i-2)*n+j-1]==1) { v++; t[(i-2)*n+j-1]=v+1; p[v][0]=i-1; p[v][1]=j; p[v][2]=2; }
if (i<m && t[i*n+j-1]==1) { v++; t[i*n+j-1]=v+1; p[v][0]=i+1; p[v][1]=j; p[v][2]=3; }
if (j>1 && t[(i-1)*n+j-2]==1) { v++; t[(i-1)*n+j-2]=v+1; p[v][0]=i; p[v][1]=j-1; p[v][2]=4; }
k++; }
for (k=2;k<=nc;k++)
{ i=p[k][0]; j=p[k][1];
switch(p[k][2])
{case 1: j--; break; case 2: i++; break; case 3: i--; break; case 4: j++; break;}
fo<<t[(i-1)*n+j-1]-1<<" "<<pct[p[k][2]]<<"\n"; }
}
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 #1188 Casa
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1188 Casa 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!