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ă.
#include <bits/stdc++.h> using namespace std; ifstream cin("cartele.in"); ofstream cout("cartele.out"); int a[51][51], b[51][51] , aux[51][51] , n , c; int eg() { 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 fill() { for(int i = 1; i <= n; i++) for(int j = 1; j<= n; j++) aux[n-j+1][i] = b[i][j]; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) b[i][j] = aux[i][j]; } int main() { cin >> n >> c; int ok = 1; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) cin >> a[i][j]; for(int k = 1; k <= c; k++) { ok = 1; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { cin >> b[i][j]; if(b[i][j] != a[i][j]) ok = 0; } for(int f = 1; f <= 2 && !ok; f++) { for(int r = 1; r <= 4 && !ok; r++) { fill(); if(eg()) ok = 1; } if(!ok ) for(int i = 1; i <= n / 2; i++) for(int j = 1; j <= n; j++) swap(b[i][j] , b[n-i+1][j]); } if(ok) cout << 1 << '\n'; else cout << 0 << '\n'; } return 0; }