一大堆的福利之【USACO题库】The Clocks

题目描述

考虑将如此安排在一个 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


var 
        a,c:array[1..9] of longint;
        t:array[1..1000000,1..11] of longint;
        b:array[1..1000000,1..11] of longint;
        bz:array[1..4,1..4,1..4,1..4,1..4,1..4,1..4,1..4,1..4] of boolean;
        x:array[1..9,1..9] of longint=((1,1,0,1,1,0,0,0,0),
                                       (1,1,1,0,0,0,0,0,0),
                                       (0,1,1,0,1,1,0,0,0),
                                       (1,0,0,1,0,0,1,0,0),
                                       (0,1,0,1,1,1,0,1,0),
                                       (0,0,1,0,0,1,0,0,1),
                                       (0,0,0,1,1,0,1,1,0),
                                       (0,0,0,0,0,0,1,1,1),
                                       (0,0,0,0,1,1,0,1,1));
        i,j,k,head,tail,tt,ttt:longint;
procedure print(x:longint);
begin
        if t[x,10]<>1 then print(t[x,10]);
        write(t[x,11],' ');
end;
procedure pd;
var
        i,bz:longint;
begin
        bz:=0;
        for i:=1 to 9 do
        if t[tail,i]<>4 then bz:=1;
        if bz=0 then
        begin
                print(tail);
                halt;
        end;
end;
begin
        for i:=1 to 9 do
        begin
                read(tt);
                tt:=tt div 3;
                t[1,i]:=tt;
        end;
        head:=0;
        tail:=1;
        while head<tail do
        begin
                inc(head);
                for i:=1 to 9 do
                a[i]:=t[head,i];
                c:=a;
                for i:=1 to 9 do
                begin
                        if b[head,i]>2 then continue;
                        inc(tail);
                        for j:=1 to 9 do
                        t[tail,j]:=(a[j]+x[i,j]-1) mod 4+1;
                        if bz[t[tail,1],t[tail,2],t[tail,3],t[tail,4],t[tail,5],t[tail,6],t[tail,7],t[tail,8],t[tail,9]] then
                        begin
                                dec(tail);
                                continue;
                        end;
                        bz[t[tail,1],t[tail,2],t[tail,3],t[tail,4],t[tail,5],t[tail,6],t[tail,7],t[tail,8],t[tail,9]]:=true;
                        t[tail,10]:=head;
                        t[tail,11]:=i;
                        pd;
                        for j:=1 to 9 do
                        b[tail,j]:=b[head,j];
                        inc(b[tail,i]);
                end;
        end;
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值