usaco1.4.2——clock

终于,又返回usaco了。


译:
描述

考虑将如此安排在一个 3 x 3 行列中的九个时钟:

 |-------|    |-------|    |-------|
 |       |       |       |       |   |   |
 |---O   |    |---O   |    |   O   |
 |       |         |       |    |       |
 |-------|    |-------|    |-------|
     A            B            C

 |-------|    |-------|    |-------|
 |          |    |         |     |         |
 |   O     |     |   O   |      |   O   |
 |   |   |         |   |   |       |   |   |
 |-------|    |-------|    |-------|
     D            E            F

 |-------|    |-------|    |-------|
 |          |    |         |     |         |
 |    O   |    |   O---|      |   O   |
 |     |   |    |            |    |   |   |
 |-------|    |-------|    |-------|
     G            H            I


目标要找一个最小的移动顺序将所有的指针指向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:

(file clocks.in)

第1-3行: 三个空格分开的数字,每个数字表示一个时钟的初始时间,3,6,9,12。数字的含意和上面第一个例子一样。

OUTPUT FORMAT:

(file clocks.out)

单独的一行包括一个用空格分开的将所有指针指向12:00的最短移动顺序的列表。

如果有多种方案,输出那种使其连接起来数字最小的方案。(举例来说5 2 4 6 < 9 3 1 1)。

SAMPLE INPUT

9 9 12
6 6 6
6 3 6

SAMPLE OUTPUT

4 5 8 9

分析:
用0,1,2,3表示钟的状态,分别代表0,3,6,9点
操作4次即产生重复效果,所以枚举0~3即可,
4^9也很有限,
由于状态很少,且操作的影响已知且固定
于是
暴搜。。。就是这样。。。
(这题困扰我很久)

View Code
 1 {
2 ID:codeway3
3 PROG:clocks
4 LANG:PASCAL
5 }
6 program clocks;
7 type
8 ll=array[0..9]of longint;
9 var
10 i,i1,i2,i3,i4,i5,i6,i7,i8,i9,j,n,m,k,l:longint;//i系列为循环变量
11 a,b,c,d,e:ll;
12
13 procedure cz;//操作
14 var
15 i,j:longint;
16 begin//以下为对每个操作影响的钟进行调整
17 i:=i1;
18 while i>0 do begin dec(i);inc(b[1]);inc(b[2]);inc(b[4]);inc(b[5]);end;
19 i:=i2;
20 while i>0 do begin dec(i);inc(b[1]);inc(b[2]);inc(b[3]);end;
21 i:=i3;
22 while i>0 do begin dec(i);inc(b[2]);inc(b[3]);inc(b[5]);inc(b[6]);end;
23 i:=i4;
24 while i>0 do begin dec(i);inc(b[1]);inc(b[4]);inc(b[7]);end;
25 i:=i5;
26 while i>0 do begin dec(i);inc(b[2]);inc(b[4]);inc(b[5]);inc(b[6]);inc(b[8]);end;
27 i:=i6;
28 while i>0 do begin dec(i);inc(b[3]);inc(b[6]);inc(b[9]);end;
29 i:=i7;
30 while i>0 do begin dec(i);inc(b[4]);inc(b[5]);inc(b[7]);inc(b[8]);end;
31 i:=i8;
32 while i>0 do begin dec(i);inc(b[7]);inc(b[8]);inc(b[9]);end;
33 i:=i9;
34 while i>0 do begin dec(i);inc(b[5]);inc(b[6]);inc(b[8]);inc(b[9]);end;
35 end;//这里要小心谨慎,千万别打错
36
37 procedure print;//输出
38 var
39 i,j:Longint;
40 begin//e存储每个操作的操作次数
41 j:=0;
42 for i:=1 to 9 do
43 while e[i]>0 do begin
44 if j=1 then write(' ');
45 dec(e[i]);
46 write(i);
47 j:=1;
48 end;
49 writeln;
50 end;
51
52 procedure doing;
53 var
54 i,j:longint;
55 begin
56 fillchar(b,sizeof(b),0);
57 fillchar(d,sizeof(d),0);//清暂时数组,d暂存新状态,b暂存操作产生的状态变化
58 cz;
59 for i:=1 to 9 do d[i]:=a[i]+b[i];//a为原状态,不改变,用d比较
60 for i:=1 to 9 do d[i]:=d[i] mod 4;
61 j:=0;
62 for i:=1 to 9 do if c[i]<>d[i] then j:=1;//c数组为标准状态数组,比较用
63 if j=0 then begin
64 l:=i1+i2+i3+i4+i5+i6+i7+i8+i9;
65 e[1]:=i1;
66 e[2]:=i2;
67 e[3]:=i3;
68 e[4]:=i4;
69 e[5]:=i5;
70 e[6]:=i6;
71 e[7]:=i7;
72 e[8]:=i8;
73 e[9]:=i9;//暂存枚举的状态
74 end;
75 end;
76
77 begin
78 assign(input,'clocks.in');
79 reset(input);
80 assign(output,'clocks.out');
81 rewrite(output);
82 for i:=1 to 9 do begin read(a[i]);a[i]:=a[i] div 3;end;
83 l:=maxlongint;
84 for i9:=0 to 3 do
85 for i8:=0 to 3 do
86 for i7:=0 to 3 do
87 for i6:=0 to 3 do
88 for i5:=0 to 3 do
89 for i4:=0 to 3 do
90 for i3:=0 to 3 do
91 for i2:=0 to 3 do
92 for i1:=0 to 3 do
93 if i1+i2+i3+i4+i5+i6+i7+i8+i9<l then doing;//强力枚举并处理
94 print;
95 close(input);
96 close(output);
97 end.

错误两次,
第一次是忘了开输入输出文件(时间久了忘了)
第二次是忘了注意空格,行末多输出了一个空格,悲剧,要注意。。。。


posted on 2011-10-12 21:57  codeway3  阅读(364)  评论(0编辑  收藏  举报

导航