1250. 【USACO题库】1.4.2 The Clocks (Standard IO)

本文介绍了一个经典的USACO编程问题——时钟谜题。任务是找到最少的操作次数来将9个时钟(排列成3x3矩阵)的所有指针调整至12点方向。文章详细说明了9种旋转操作及其影响,并提供了示例输入输出及一种可行的解决方案。

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

题目描述

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


|-------|    |-------|    |-------|

|       |    |       |    |   |   |

|---O   |    |---O   |    |   O   |

|       |    |       |    |       |

|-------|    |-------|    |-------|

    A            B            C



|-------|    |-------|    |-------|

|       |    |       |    |       |

|   O   |    |   O   |    |   O   |

|   |   |    |   |   |    |   |   |

|-------|    |-------|    |-------|

    D            E            F



|-------|    |-------|    |-------|

|       |    |       |    |       |

|   O   |    |   O---|    |   O   |

|   |   |    |       |    |   |   |

|-------|    |-------|    |-------|

    G            H            I



目标要找一个最小的移动顺序次将所有的指针指向12点。

下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。

选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度。














































移动方法受影响的时钟
1ABDE
2ABC
3BCEF
4ADG
5BDEFH
6CFI
7DEGH
8GHI
9EFHI


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










第1-3行:三个空格分开的数字,每个数字表示一个时钟的初始时间,3,6,9,12。

数字的含意和上面第一个例子一样。


SAMPLE INPUT (file clocks.in)


9 9 12

6 6 6

6 3 6


OUTPUT FORMAT


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

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


SAMPLE OUTPUT (file clocks.out)


4 5 8 9

输入
输出
样例输入
 
           
样例输出
 
           
数据范围限制
Fortuna OJ 项目
作者:  moreD RD ; 协力:  twilight
由 Codeigniter / Bootstrap 驱动

Glyphicons 提供图标

哎!又一道淼题!

本来以为很难,事实上......

被洗脑后识破此题本质....

水的不要不要的模拟!

每一个操作不能做4次或以上,否则有重复

枚举每个操作用几次,z递归保证字典序

时间复杂度4^9=262144,1秒内

可过!

标程(请勿抄袭):

var
        i,j,k,m,n,o,p,l,s,t:longint;
        a,g:array[1..3,1..3] of longint;
        b:array[0..1000] of longint;
function jia(t:longint):longint;
begin
        jia:=(t+3) mod 12;
        if jia=0 then jia:=12;
end;
procedure turn(t:longint);
begin
        if t=1 then begin
                g[1,1]:=jia(g[1,1]);g[1,2]:=jia(g[1,2]);g[2,1]:=jia(g[2,1]);g[2,2]:=jia(g[2,2]);
        end;
        if t=2 then begin
                g[1,1]:=jia(g[1,1]);g[1,2]:=jia(g[1,2]);g[1,3]:=jia(g[1,3]);
        end;
        if t=3 then begin
                g[1,2]:=jia(g[1,2]);g[1,3]:=jia(g[1,3]);g[2,2]:=jia(g[2,2]);g[2,3]:=jia(g[2,3]);
        end;
        if t=4 then begin
                g[1,1]:=jia(g[1,1]);g[2,1]:=jia(g[2,1]);g[3,1]:=jia(g[3,1]);
        end;
        if t=5 then begin
                g[1,2]:=jia(g[1,2]);g[2,1]:=jia(g[2,1]);g[2,2]:=jia(g[2,2]);g[2,3]:=jia(g[2,3]);g[3,2]:=jia(g[3,2]);
        end;
        if t=6 then begin
                g[1,3]:=jia(g[1,3]);g[2,3]:=jia(g[2,3]);g[3,3]:=jia(g[3,3]);
        end;
        if t=7 then begin
                g[2,1]:=jia(g[2,1]);g[2,2]:=jia(g[2,2]);g[3,1]:=jia(g[3,1]);g[3,2]:=jia(g[3,2]);
        end;
        if t=8 then begin
                g[3,1]:=jia(g[3,1]);g[3,2]:=jia(g[3,2]);g[3,3]:=jia(g[3,3]);
        end;
        if t=9 then begin
                g[2,2]:=jia(g[2,2]);g[2,3]:=jia(g[2,3]);g[3,2]:=jia(g[3,2]);g[3,3]:=jia(g[3,3]);
        end;
end;
procedure dg(t:longint);
var
        i,j:longint;
begin
        if t>9 then begin
                for i:=1 to b[0] do
                begin
                        turn(b[i]);
                end;
                o:=0;
                for i:=1 to 3 do
                        for j:=1 to 3 do
                                if g[i,j]<>12 then o:=1;
                if o=0 then begin
                        for i:=1 to b[0] do write(b[i],' ');
                        halt;
                end;
                g:=a;
        end else begin
                for i:=0 to 3 do begin
                        for j:=1 to i do begin
                                inc(b[0]);
                                b[b[0]]:=t;
                        end;
                        dg(t+1);
                        dec(b[0],i);
                end;
        end;
end;
begin
        for i:=1 to 3 do begin
                for j:=1 to 3 do
                        read(a[i,j]);
                readln;
        end;
        g:=a;
        b[0]:=0;
        dg(0);
end.







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值