Rezolvare completă PbInfo #1390 cartele

Enunt

În sediul unei firme se intră doar cu ajutorul cartelelor magnetice. De câte ori se schimbă codurile de acces, cartelele trebuie formatate. Formatarea presupune imprimarea unui model prin magnetizare. Dispozitivul în care se introduc cartelele, numit cititor de cartele, verifică acest model. Toate cartelele au aceleaşi dimensiuni, suprafaţa pătrată şi grosimea neglijabilă. Cele două feţe plane ale unei cartele se împart fiecare în NxN celule pătrate, identice ca dimensiuni. Prin formatare unele celule, marcate cu negru în exemplu, se magnetizează permiţând radiaţiei infraroşii să treacă dintr-o parte în cealaltă a cartelei. În interiorul cititorului de cartele se iluminează uniform una dintre feţele cartelei. De cealaltă parte fasciculele de lumină care străbat cartela sunt analizate electronic. Pentru a permite accesul în clădire modelul imprimat pe cartelă trebuie să coincidă exact cu modelul şablonului care memorează codul de intrare. Prin fanta dispozitivului nu se pot introduce mai multe cartele deodată. Cartela se poate introduce prin fantă cu oricare dintre muchii spre deschizătura fantei şi cu oricare dintre cele două feţe orientate către şablon. După introducere cartela se dispune în plan paralel cu şablonul, lipit de acesta, astfel încât cele patru colţuri ale cartelei se suprapun exact cu colţurile şablonului. Modelele imprimate pe cele două feţe ale unei cartele sunt identice. Unei celule magnetizate îi corespunde pe faţa opusă tot o celulă magnetizată, iar unei celule nemagnetizate îi corespunde una nemagnetizată. O celulă magnetizată este transparentă pentru radiaţia infraroşie indiferent de faţa care se iluminează.

Sablon Cartela 1 Cartela 2

Un angajat al firmei are mai multe cartele. Pe unele dintre acestea a fost imprimat noul cod de intrare, iar pe altele sunt coduri mai vechi. Pentru a afla care sunt cartelele care-i permit accesul în sediul firmei angajatul este nevoit să le verifice pe toate, introducându-le pe rând, în toate modurile pe care le consideră necesare, în fanta cititorului de cartele.

Cerința

Scrieţi un program care determină care dintre cartele permite accesul în sediul firmei.

Date de intrare

Fişierul de intrare cartele.in conţine pe prima linie două numere naturale N şi C despărţite printr-un spaţiu. N este dimensiunea tablourilor care reprezintă modelul şablon şi modelele cartelelelor. C reprezintă numărul de cartele. Urmează C+1 blocuri de câte N linii fiecare. Primul bloc de N linii codifică şablonul. Următoarele C blocuri de câte N linii codifică fiecare câte o cartelă. Pe fiecare linie sunt câte N valori întregi, despărţite printr-un singur spaţiu. Celulelor magnetizate le corespunde valoarea 1, iar celorlalte, valoarea 0.

Date de ieșire

În fişierul de ieşire cartele.out se vor scrie C linii, câte o valoare pe linie. Pe linia i se va scrie valoarea 1 dacă cartela i permite accesul în clădire şi valoarea 0 în caz contrar.

Restricții și precizări

  • 1 < N, C <= 50

Exemplu

cartele.in

3 2
0 1 0
0 0 1
1 0 0
1 0 0
0 0 1
0 1 0
0 0 1
0 0 1
0 1 0

cartele.out

1
0

Explicație

Datele de intrare corespund situaţiei din figură. Cartela 1 se potriveşte perfect şablonului, dacă se roteşte în sens trigonometric cu 90 de grade. Cartela 2 nu se potriveşte şablonului, indiferent de modul în care se introduce în fantă.

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 cartele:

#include <fstream>
#include <iostream>
#define DIM 51
using namespace std;
ifstream fin("cartele.in");
ofstream fout("cartele.out");

int a[DIM][DIM], b[DIM][DIM];  // sablonul, cartela
int aux[DIM][DIM];
int n, C;                      

int  Egale();                 
void Inverseaza();            // intoarce cartela pe partea cealalta (oglindire fata de linia i = n/2)
void Roteste();               // rotire 90 grade in sens trigonometric
void Rezolva();

int main()
{
   Rezolva();
   fin.close();
   fout.close();
   return 0;
}

void Rezolva()
{
   fin >> n >> C;
   int i, j, r;
   int identice = 1;
   for (i = 1; i <= n; i++)
      for (j = 1; j <= n; j++)
     fin >> a[i][j];
       
   for (int k = 1; k <= C; k++)
      {
         identice = 1;
         for (i = 1; i <= n; i++)
            for (j = 1; j <= n; j++)
               {
                  fin >> b[i][j];
                  if ( b[i][j] != a[i][j] ) identice = 0;
               }
 
         for (int f = 1; f <= 2 && !identice; f++)  // pentru fata 1 si 2
            {
               for (r = 1; r <= 4 && !identice; r++)  // la a patra rotatie se revine la matricea initiala
                  {  
                     Roteste();    // cu 90 in sens trigonometric  
                     if ( Egale() ) identice = 1;
                  }
               if ( !identice ) Inverseaza();
            }
         if ( identice ) 
            fout << 1 << '\n';
         else           
            fout << 0 << '\n';
      }          
}
        
int Egale()
{
   for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
         if ( a[i][j] != b[i][j] ) return 0;
   return 1;
}

void Inverseaza()
{
   int i, j, temp;
   for (i = 1; i <= n / 2; i++)
      for (j = 1; j <= n; j++)
         temp = b[i][j], b[i][j] = b[n-i+1][j], b[n-i+1][j] = temp;
} 
             
void Roteste()              
{
   int i, j;              
   for (i = 1; i <= n; i++)
      for (j = 1; j<= n; j++)
         aux[n-j+1][i] = b[i][j];
 
   for (i = 1; i <= n; i++)
      for (j = 1; j <= n; j++)
         b[i][j] = aux[i][j];
}

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 #1390 cartele

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1390 cartele 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!