您的位置:首页 > 其它

Usaco 1.4.2 时钟(The Clocks)

2011-08-05 11:31 633 查看
题目:

时钟

来源:

Usaco1.4.2

题目大意:

给定9个时钟,及转动方法,求一个最小的转动方案

移动方法受影响的时钟

1ABDE

2ABC

3BCEF

4ADG

5BDEFH

6CFI

7DEGH

8GHI

9EFHI


数据范围:

就9个时钟,都有解

样例:

9912

666

636


4589




做题思路:

每种转动方法使用先后没大碍,所以从小的开始搜,保证最小方案,每一个方法最少用0次,最多3次,4次等于没用,然后判断皆可。3、6、9、12四个时间可以用1、2、3、0来代替,看出规律了吧。

知识点:

深搜、模拟

{
ID:DountNameless
TASK:clocks
LANG:PASCAL
}
var
a,b:array[1..9]oflongint;
data:array[1..9,0..5]oflongint=((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));
x,i:longint;
ans:string;
procedureprint;
var
i,j:longint;
begin
fori:=1to9do
ifa[i]mod4<>0thenexit;{<如果不是0则说明还有没指向12点的>}
ans:='';
fori:=1to9do
forj:=1tob[i]do
ans:=ans+chr(i+48)+'';{<这样在输出前delete一位,省去对方案只有一位数的特殊处理>}
delete(ans,length(ans),1);
writeln(ans);
close(input);close(output);
halt;
end;
proceduredfs(k:longint);{<深搜>}
var
i,j:longint;
begin
ifk=10thenprint
else
begin
fori:=0to3do{<枚举每个方案的使用情况>}
begin
b[k]:=i;
forj:=1todata[k,0]doinc(a[data[k,j]],i);{<data[k,0]存的是该方案有哪几个表变了>}
dfs(k+1);
forj:=1todata[k,0]dodec(a[data[k,j]],i);
end;
end;
end;
begin
assign(input,'clocks.in');reset(input);
assign(output,'clocks.out');rewrite(output);
fori:=1to9do
begin
read(x);
a[i]:=xdiv3;
end;
dfs(1);
close(input);close(output);
end.题目来源:http://ace.delos.com/usacoprob2?a=YqYGTaSaabV&S=clocks
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: