[題目描述]
The Clocks
時鐘
IOI'94 - Day 2
考慮將如此安排在一個 3 x3 行列中的九個時鐘:
目標要找一個最小的移動順序次將所有的指針指向12點。
下面原表格列出了9種不同的旋轉指針的方法,每一種方法都叫一次移動。
選擇1到9號移動方法,將會使在表格中對應的時鐘的指針順時針旋轉90度。
移動方法 | 受影響的時鐘 |
1 | ABDE |
2 | ABC |
3 | BCEF |
4 | ADG |
5 | BDEFH |
6 | CFI |
7 | DEGH |
8 | GHI |
9 | EFHI |
Example
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
[但這可能不是正確的方法,請看下面]
PROGRAM NAME: clocks
INPUT FORMAT
第1-3行: | 三個空格分開的數字,每個數字表示一個時鐘的初始時間,3,6,9,12。 數字的含意和上面第一個例子一樣。 |
SAMPLE INPUT (file clocks.in)
9 9 12
6 6 6
6 3 6
OUTPUT FORMAT
單獨的一行包括一個用空格分開的將所有指針指向12:00的最短移動順序的列表。
如果有多種方案,輸出那種使的連接起來數字最小的方案。(舉例來說5 2 4 6 < 9 3 1 1)。
SAMPLE OUTPUT (file clocks.out)
4 5 8 9
[解題思路]
就是搜索啦,狀態量並不大,一個時鐘如果轉動4次就相當於沒轉,所以最多隻可能轉3次,所以有4^9的狀態量,DFS枚舉每一條命令的操作次數,最後輸出即可。
[Code]
{
ID: zane2951
PROG: clocks
LANG: PASCAL
}
program clocks;
const
w:array[1..9,0..5] of longint=((4,1,2,4,5,0),
(3,1,2,3,0,0),
(4,2,3,5,6,0),
(3,1,4,7,0,0),
(5,2,4,5,6,8),
(3,3,6,9,0,0),
(4,4,5,7,8,0),
(3,7,8,9,0,0),
(4,5,6,8,9,0));
type
ary=array[0..10] of longint;
var
a,t:ary;
i,j,top:longint;
ko:boolean;
//---------change----------
procedure change(x,t:longint);
var
i:longint;
begin
for i:=1 to w[x,0] do a[w[x,i]]:=(a[w[x,i]]+3*t) mod 12;
end;
//---------check-----------
function check:boolean;
var
i:longint;
begin
for i:=1 to 9 do if a[i] mod 12<>0 then exit(false);
exit(true);
end;
//----------run------------
procedure run(dp:longint);
var
i:longint;
tmp:ary;
begin
if dp>9 then
begin
ko:=check;
exit;
end;
tmp:=a;
for i:=0 to 3 do
begin
change(dp,i);
t[dp]:=i;
run(dp+1);
if ko then exit;
a:=tmp;
end;
end;
//----------main-----------
begin
assign(input,'clocks.in'); reset(input);
assign(output,'clocks.out'); rewrite(output);
for i:=1 to 9 do read(a[i]);
fillchar(t,sizeof(t),$FF);
ko:=false;
run(1);
ko:=false;
for i:=1 to 9 do
if t[i]>0 then
for j:=1 to t[i] do
if not ko then begin write(i); ko:=true; end else write('':1,i);
writeln;
close(input); close(output);
end.