Usaco 1.4.2 时钟(The Clocks)

本文详细解析了Usaco编程竞赛中1.4.2章节的时钟问题,探讨如何使用Pascal语言处理输入输出,以及解决过程中涉及的数据删除和除法运算技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

 时钟

来源:

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值