This is an old revision of the document!
Responsabili: Andrei Pârvu, Emil Racec
Termen de predare: 4 decembrie 2012 23:55. Tema se va trimite prin intermediul platformei de cursuri cs.curs
Obiective: După realizarea acestei teme de casă studentul va fi capabil să:
Cunoștințe necesare rezolvării acestei teme de casă:
Pentru a putea intra în sediul Serviciului Central de Spionaj agenții secreți au nevoie de o cartelă de acces, care este de forma unei matrice de dimensiuni NxN
. Celulele acestei cartele pot fi de două tipuri: 0
– permite lumina infraroșie a scaner-ului de cartele sa treacă sau 1
– nu permite lumina să treacă. Astfel, atunci când se introduce cartela, se formează un șablon care este comparat cu o listă de șabloane din baza de date, iar dacă se găsește cel puțin o potrivire atunci se permite accesul agentului ce a folosit cartela respectivă.
Tocmai ai fost angajat ca șef al diviziei informatice a SCS, iar prima ta cerință este să scrii un program care să verifice dacă o cartelă introdusă corespunde cu vreun șablon din baza de date. Sarcina nu este atât de simplă, deoarece când o cartelă este introdusă ea poate să fie rotită în sens trigonometric sau anti-trigonometric cu 90
, 180
sau 270
de grade sau poate să fie întoarsă cu ”fața în sus” - oglindire verticală sau orizontală. Toate aceste posibile mișcări nu trebuie să influențeze validitatea unei cartele – cu alte cuvinte, daca o cartelă poate fi rotită sau oglindită astfel încât să se potrivească cu un șablon, atunci ea va fi considerată validă.
Codificăm aceste operații în felul următor:
T90
- rotație sens trigonometric 90 de gradeT180
- rotație sens trigonometric 180 de gradeT270
- rotație sens trigonometric 270 de gradeA90
- rotație sens anti-trigonometric 90 de gradeA180
- rotație sens anti-trigonometric 180 de gradeA270
- rotație sens anti-trigonometric 270 de gradeV
- oglindire verticalăO
- oglindire orizontală
Datele de intrare se citesc de la tastatură, pe prima linie găsindu-se două numere întregi N
- dimensiunea cartelei si a șabloanelor si M
- numărul de șabloane.
Următoarele N
linii descriu cartela, astfel cel de-al j
-lea număr de pe a i
-a astfel de linie reprezintă elementul (i, j)
al cartelei. Aceste numere sunt separate printr-un spatiu, si pot fi doar 0
sau 1
.
În continuare, sunt descrise cele M
sabloane într-un mod asemănător cu cel de descriere al cartelei.
Programul va afișa la ecran M
linii, câte una pentru fiecare șablon. Dacă al i
-lea șablon nu poate fi obținut din cartela, atunci se va afisa textul “NU”. Dacă șablonul se potrivește fără să fie nevoie de vreo mutare, atunci se poate afișa textul “IDENTIC” (sau o serie de mutări care se anulează reciproc). Altfel trebuie afisată o listă de mutări (separate printr-un spațiu) care pot fi aplicate cartelei astfel încat să obținem șablonul. Lista de mutări NU trebuie să fie de dimensiune minimă. Mutările sunt afișate conform codificării de mai sus.
1 ≤ N ≤ 50
1 ≤ M ≤ 50
Fie următoarea secvență de date de intrare, (matricele de NxN
au fost separate printr-o linie goală doar pentru a se înțege mai ușor inputul - acestea nu vor fi prezente în fișierele de intrare din teste, respectându-se formatul descris mai sus):
3 6 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1
Se va afișa la ecran (binînțeles nu este singura variantă corectă):
T90 NU V A90 V T90 IDENTIC
Fișierul sursă trimis de voi va trebui să se numească tema3.c
(fără majuscule!). El va fi compilat folosind gcc
sub Linux, astfel că indiferent de mediul de programare folosit la elaborarea programului, tema voastră va trebui să fie compilabila cu gcc
. Makefile-ul folosit la compilarea temei voastre este cel folosit în cadrul Laboratorului 1, cu actualizările de rigoare.
Implementarea voastră trebuie să fie modulară; definiți-vă și folosiți cât mai multe funcții.
Datele de intrare se vor considera valide, de accea NU trebuie să faceți nici un fel de verificare asupra acestora.
Deși programul vostru va trebui să citească direct de la tastatură și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți să citiți datele și să le scrieți în fișiere text, folosind redirectarile din consolă, fără să modificați programul. Dacă fișierul de intrare este example.in
, și cel de ieșire este example.out
, iar programul vostru se numește tema3, comanda la consolă va fi:
./tema3 < example.in > example.out
Dat fiind că pot exista mai multe variante corecte de a transforma cartela în unul din șabloane, testele nu vor avea un fișier de ieșire corect cu care va fi comparat outputul vostru. În schimb, va exista un verificator ce vă va simula mutările afișate de voi și va compara rezultatul final cu șablonul ce trebuie obtinut.