[USACO 1.4.2] The Clocks

[題目描述]

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章