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也很有限,
由于状态很少,且操作的影响已知且固定
于是
暴搜。。。就是这样。。。
(这题困扰我很久)
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.
错误两次,
第一次是忘了开输入输出文件(时间久了忘了)
第二次是忘了注意空格,行末多输出了一个空格,悲剧,要注意。。。。