Puzzle

 

Printre multele sale hobby-uri, Vasilică este pasionat și de puzzle-uri. Recent, el a descoperit un program cu care poate transforma orice imagine într-un puzzle cu piese pătrate. Programul ia o imagine, o decupează în piese pătrate pe care apoi le rotește și le amestecă, rezultând o nouă imagine.

Din păcate, versiunea demo a programului nu-i permite să și reconstituie imaginea, și cum până la bursă mai e ceva, Vasilică s-a hotărât să facă singur un program care să rezolve puzzle-urile generate de versiunea demo.

Programul pe care Vasilică vrea să-l realizeze – cu ajutorul vostru – trebuie să poată determina poziția și rotația pieselor de puzzle plecând de la imaginea originală și de la o imagine realizată din piese amestecate. Pentru început Vasilică vrea să rezolve doar puzzle-uri grayscale (în alb/negru). Astfel, se consideră că o imagine este formată din Lung x lat pixeli (puncte), fiecare putând fi colorat într-o tentă de gri. Pentru acest caz, se consideră că un punct poate avea doar 256 de tente posibile. Prin convenție, albul este reprezentat cu valoarea 255, iar negrul cu valoarea 0, celelalte nuanțe de gri fiind reprezentate prin valori intermediare (1-254)

Cerințe

Se va realiza un program C care, primind la intrare o matrice reprezentând imaginea originală și o matrice reprezentând imaginea formată din piesele amestecate va produce la ieșire un șir de tupluri(poziție_în_puzzle, poziție_în_original, rotație) reprezentând poziția și rotația pieselor pentru a obține imaginea originală. Șirul va fi ordonat după poziție_în_puzzle.

Formatul datelor

Datele de intrare se vor citi de la intrarea standard (stdin) și se vor afișa la ieșirea standard (stdout) folosind redirectări de fișiere.

Formatul acestor date este prezentat în secțiunile următoare.

Atenție! – Respectați formatul de intrare și cel de ieșire al datelor. Testarea funcțională se va face cu un evaluator automat.

Date de intrare

Datele se vor citi de la tastatură (sau dintr-un fișier folosind redirectări de consolă) și vor avea următoarea formă:

  1. pe primul rând două valori întregi reprezentând lățimea W și înălțimea H a imaginii

  2. pe al doilea rând o valoare întreagă reprezentând latura P a unei piese de puzzle

  3. pe următoarele H rânduri câte W valori naturale între 0-255 reprezentând pixelii din imaginea originală

  4. pe următoarele H rânduri câte W valori naturale între 0-255 reprezentând pixelii din imaginea amestecată

Se impun următoarele restricții pentru valorile de intrare:

  • atât W cât și H să fie mai mici sau egale cu 512

  • valoarea P să dividă atât W cât și H (nu se acceptă fracțiuni de piesă)

  • valoarea P trebuie să fie mai mare decât 1

  • valorile pixelilor să fie în intervalul specificat

Vor exista teste în care aceste restricții nu vor fi respectate. În acest caz programul va trebui să afișeze un mesaj de eroare și să iasă cu valoarea 1. Se va folosi în acest sens ori apelul return 1; ori funcția exit() (pentru care trebuie inclus fișierul <stdlib.h>.

În caz de succes, programul va afișa datele de ieșire după specificația următoare și va returna către sistemul de operare valoarea 0 (return 0;)

Date de ieșire

În cazul în care datele de intrare sunt corecte se va afișa o listă cu piesele de puzzle și poziționarea lor (poziție și rotație), astfel:

  • un număr de \frac{W*H}{P^2} linii (numărul de piese din puzzle) conținând trei valori întregi cu următoarea semnificație:

    1. poziția piesei în imaginea amestecată

    2. poziția piesei în imaginea originală

    3. rotația piesei, codificată astfel:

      • 0 – piesă nerotită

      • 1 – piesă rotită 90 de grade în sens orar

      • 2 – piesă rotită 180 de grade în sens orar

      • 3 – piesă rotită 270 de grade în sens orar

Rotația piesei se referă la unghiul cu care trebuie rotită piesa din imaginea amestecată pentru a obține piesa din imaginea originală.

Poziția unei piese se va determina prin numărare, de la stânga la dreapta și de sus în jos, ca în figură:

puzzle

 

Exemple de date

Fie următoarele date de intrare:

4 4 2 123 59 95 136 186 83 220 29 121 18 92 151
93 209 5 216
59 83 209 93
123 186 18 121 216 5 136 29 151 92 95 220

Datele de ieșire trebuie să fie următoarele:

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

 

                                                                 Data: 30.11.2008