Rezolvare completă PbInfo #1188 Casa

Î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 şi 1 în care există N valori egale cu 1, ce corespund camerelor, iar prima linie, ultima linie, prima coloană şi ultima coloană au cel puţin un element egal cu 1.
  • prin construcţie: un şir de N-1 perechi (a[i], b[i]) 1≤i<n în care a[i] din {1,2,…,i} şi b[i] din {N, S, E, V}. Camerele vor fi numerotate de la 1 la n. Perechea (a[i], b[i]) precizează poziţia camerei i+1 faţă de camera a[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

  1. Se dă descrierea unei case prin construcţie şi se cere descrierea acesteia prin matricea minimală.
  2. 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ărul p poate avea valoarea 1 sau 2.
  • Dacă valoarea lui p este 1 atunci liniile următoare conţin descrierea unei case prin construcţie astfel: pe linia a doua un număr natural N reprezentând numărul de camere ale casei, iar pe fiecare din următoarele N-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 este 2 atunci liniile următoare conţin descrierea unei case prin matrice minimală astfel: pe linia a doua două numere naturale nenule M, N reprezentând dimensiunile matricei, iar pe următoarele M linii câte N numere 0 sau 1 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 Adresa de email.

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!