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 .
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!