1.4.2 The Clocks
IOI'94 - Day 2
Consider nine clocks arranged in a 3x3 array thusly:
|-------| |-------| |-------| | | | | | | | |---O | |---O | | O | | | | | | | |-------| |-------| |-------| A B C |-------| |-------| |-------| | | | | | | | O | | O | | O | | | | | | | | | | |-------| |-------| |-------| D E F |-------| |-------| |-------| | | | | | | | O | | O---| | O | | | | | | | | | |-------| |-------| |-------| G H I
The goal is to find a minimal sequence of moves to return all the dials to 12 o'clock. Nine different ways to turn the dials on the clocks are supplied via a table below; each way is called a move. Select for each move a number 1 through 9 which will cause the dials of the affected clocks (see next table) to be turned 90 degrees clockwise.
Move | Affected clocks |
1 | ABDE |
2 | ABC |
3 | BCEF |
4 | ADG |
5 | BDEFH |
6 | CFI |
7 | DEGH |
8 | GHI |
9 | EFHI |
Example
Each number represents a time accoring to following table:
9 9 12 9 12 12 9 12 12 12 12 12 12 12 12 6 6 6 5 -> 9 9 9 8-> 9 9 9 4 -> 12 9 9 9-> 12 12 12 6 3 6 6 6 6 9 9 9 12 9 9 12 12 12
[But this might or might not be the `correct' answer; see below.]
PROGRAM NAME: clocks
INPUT FORMAT
Lines 1-3: | Three lines of three space-separated numbers; each number represents the start time of one clock, 3, 6, 9, or 12. The ordering of the numbers corresponds to the first example above. |
SAMPLE INPUT (file clocks.in)
9 9 12 6 6 6 6 3 6
OUTPUT FORMAT
A single line that contains a space separated list of the shortest sequence of moves (designated by numbers) which returns all the clocks to 12:00. If there is more than one solution, print the one which gives the lowest number when the moves are concatenated (e.g., 5 2 4 6 < 9 3 1 1).
SAMPLE OUTPUT (file clocks.out)
4 5 8 9
{ ID:makeeca1 PROG:clocks LANG:PASCAL } const ch:array[1..9,1..9]of 0..3= ((3,3,3,3,3,2,3,2,0), (2,3,2,3,2,3,1,0,1), (3,3,3,2,3,3,0,2,3), (2,3,1,3,2,0,2,3,1), (2,3,2,3,1,3,2,3,2), (1,3,2,0,2,3,1,3,2), (3,2,0,3,3,2,3,3,3), (1,0,1,3,2,3,2,3,2), (0,2,3,2,3,3,3,3,3)); var a:array[1..9]of byte; ans:array[1..9]of byte; i,j,k:byte; s:string; begin assign(input,'clocks.in'); reset(input); assign(output,'clocks.out'); rewrite(output); readln(a[1],a[2],a[3]); readln(a[4],a[5],a[6]); readln(a[7],a[8],a[9]); for i:=1 to 9 do a[i]:=a[i] div 3; for i:=1 to 9 do for k:=1 to 9 do inc(ans[k],ch[i,k]*(4-a[i])); for i:=1 to 9 do ans[i]:=ans[i] and 3; s:=''; for i:=1 to 9 do for j:=1 to ans[i] do s:=s+chr(i+48)+' '; delete(s,length(s),1); writeln(s); close(input); close(output); end.