题目: | 时钟 | |
来源: | Usaco1.4.2 | |
题目大意: | 给定9个时钟,及转动方法,求一个最小的转动方案 移动方法 受影响的时钟 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI | |
数据范围: | 就9个时钟,都有解 | |
样例: |
9 9 12 6 6 6 6 3 6 |
4 5 8 9 |
做题思路: | 每种转动方法使用先后没大碍,所以从小的开始搜,保证最小方案,每一个方法最少用0次, 最多3次,4次等于没用,然后判断皆可。3、6、9、12四个时间可以用1、2、3、0来代替, 看出规律了吧。 | |
知识点: | 深搜、模拟 |
{
ID:Dount Nameless
TASK:clocks
LANG:PASCAL
}
var
a,b:array[1..9] of longint;
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;
procedure print;
var
i,j:longint;
begin
fori:=1 to 9 do
ifa[i] mod 4<>0 then exit;{<如果不是0则说明还有没指向12点的>}
ans:='';
fori:=1 to 9 do
forj:=1 to b[i] do
ans:=ans+chr(i+48)+' ';{<这样在输出前delete一位,省去对方案只有一位数的特殊处理>}
delete(ans,length(ans),1);
writeln(ans);
close(input);close(output);
halt;
end;
procedure dfs(k:longint);{<深搜>}
var
i,j:longint;
begin
ifk=10 then print
else
begin
for i:=0 to 3 do{<枚举每个方案的使用情况>}
begin
b[k]:=i;
for j:=1 to data[k,0] do inc(a[data[k,j]],i);{<data[k,0]存的是该方案有哪几个表变了>}
dfs(k+1);
for j:=1 to data[k,0] do dec(a[data[k,j]],i);
end;
end;
end;
begin
assign(input,'clocks.in');reset(input);
assign(output,'clocks.out');rewrite(output);
fori:=1 to 9 do
begin
read(x);
a[i]:=x div 3;
end;
dfs(1);
close(input);close(output);
end.
题目来源:
http://ace.delos.com/usacoprob2?a=YqYGTaSaabV&S=clocks