IOI'94 - Giorno 2 - Problema 1: Gli orologi
|-------| |-------| |-------|
| | | | | | |
|---O | |---O | | O |
| | | | | |
|-------| |-------| |-------|
A B C
|-------| |-------| |-------|
| | | | | |
| O | | O | | O |
| | | | | | | | |
|-------| |-------| |-------|
D E F
|-------| |-------| |-------|
| | | | | |
| O | | O---| | O |
| | | | | | | |
|-------| |-------| |-------| (Figura 1)
G H I
Ci sono nove orologi in una matrice 3x3 (figura 1). L'obiettivo è
fare in modo che tutti gli orologi segnino le 12 con il minor numero di
mosse possibili. Ci sono nove diversi modi di spostare le lancette degli
orologi: ognuno di essi viene chiamato mossa. Indichiamo le mosse con un
numero da 1 a 9: quella mossa corrisponderà alla rotazione di 90
gradi in senso orario di alcuni degli orologi, secondo lo schema specificato
sotto (figura 2).
Dati di input
Il file INPUT.TXT contiene nove numeri. Questi numeri danno le
posizioni iniziali delle lancette: 0=ore 12, 1=ore 3, 2=ore 6, 3=ore 9.
L'esempio in figura 1 corrisponde al seguente contenuto del file:
3 3 0
2 2 2
2 1 2
Dati di output
I risultati vanno scritti sul file OUTPUT.TXT come la più
breve sequenza di mosse (numeri), che riportano tutti gli orologi alle
12. Se ci sono più soluzioni, se ne deve comunque presentare una
sola. Nel nostro esempio il file OUTPUT.TXT potrebbe essere come segue:
5849
Mossa Orologi coinvolti
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI (Figura 2)
Esempio di metodo
Ogni numero rappresenta un orario, secondo lo schema seguente:
0 = ore 12
1 = ore 3
2 = ore 6
3 = ore 9
3 3 0 3 0 0 3 0 0 0 0 0 0 0 0
2 2 2 5-> 3 3 3 8-> 3 3 3 4 -> 0 3 3 9-> 0 0 0
2 1 2 2 2 2 3 3 3 0 3 3 0 0 0
Idea dell'algoritmo
Si può notare che ciascuna mossa può essere effettuata al
più 3 volte, poiché quattro esecuzioni della stessa mossa
non hanno alcun effetto, riportando gli orologi coinvolti alla posizione
iniziale. Inoltre, l'ordine delle mosse non è importante.
La soluzione consiste nell'effettuare una ricerca in ampiezza (breadth-first)
sullo spazio delle soluzioni: notate che, essendo il numero di orologi
noto a priori, non è necessario utilizzare una coda, ma basta utilizzare
un insieme di cicli for annidati.