• WUST Online Judge


    2101: 拨钟问题

    Time Limit: 2 Sec  Memory Limit: 128 MB   64bit IO Format: %lld
    Submitted: 124  Accepted: 22
    [Submit][Status][Web Board]

    Description

    有9个时钟排成一个3*3的矩阵,从上到下从左到右依次标为ABCDEFGHI。

    每个时钟只有1个时针,时针初始指向3、6、9或12点。

    对每一个时钟的时针共允许有9种不同的移动,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。

    9种移动操作以及影响的时钟如下:

    (1)ABDE  (2)ABC    (3)BCEF

    (4)ADG   (5)BDEFH  (6)CFI

    (7)DEGH  (8)GHI    (9)EFHI

    现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。

    Input

    多组测试数据,每组测试数据3行3列,共9个整数,表示各时钟指针的起始位置,相邻两个整数之间用1个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。

    Output

    每组测试数据在一行中输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用1个空格隔开。

    Sample Input

    3 3 0
    2 2 2
    2 1 2
    

    Sample Output

    4 5 8 9

    代码如下:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        int i1, i2, i3, i4, i5, i6, i7, i8, i9, sum, cnt;
        int a[9], b[9];
        int min;
        while (scanf("%d%d%d%d%d%d%d%d%d",&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8]) != EOF) {
            memset(b, 0, sizeof(b));
            min = 10000;
            for (i1 = 0; i1 < 4; i1++)
                for (i2 = 0; i2 < 4; i2++)
                    for (i3 = 0; i3 < 4; i3++)
                        for (i4 = 0; i4 < 4; i4++)
                            for (i5 = 0; i5 < 4; i5++)
                                for (i6 = 0; i6 < 4; i6++)
                                    for (i7 = 0; i7 < 4; i7++)
                                        for (i8 = 0; i8 < 4; i8++)
                                            for (i9 = 0; i9 < 4; i9++) {
        if (((i1 + i2 + i4 + a[0]) % 4 == 0) && ((i1 + i2 + i3 + i5 + a[1]) % 4 == 0)
            && ((i2 + i3 + i6 + a[2]) % 4 == 0) && ((i1 + i4 + i5 + i7 + a[3]) % 4 == 0) &&
            ((i1 + i3 + i5 + i7 + i9 + a[4]) % 4 == 0) && ((i3 + i5 + i6 + i9 + a[5])% 4 == 0) && ((i4 + i7 + i8 + a[6]) % 4 == 0)
              && ((i5 + i7 + i8 + i9 + a[7]) % 4 == 0) && ((i6 + i8 + i9 + a[8]) % 4 == 0)) {
               sum = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9;
               if (min > sum) {
                    min = sum;
                    b[0] = i1; b[1] = i2; b[2] = i3;
                    b[3] = i4; b[4] = i5; b[5] = i6;
                    b[6] = i7; b[7] = i8; b[8] = i9;
               }
        }
                                            }
            for (cnt = 0; cnt < 9; cnt++)
                while (b[cnt]--)
                    printf("%d ", cnt + 1);
            printf("
    ");
        }
        return 0;
    }
    
    作者:McR
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    android开发内存优化之软引用
    java 异步调用与多线程
    【转】生活中的OO智慧——大话面向对象五大原则
    Java算法 -- 顺序表
    Android 画闹钟
    Android 画指南针
    Android 工具类大全
    公共技术点之面向对象六大原则
    xml转对象1
    xml转对象
  • 原文地址:https://www.cnblogs.com/mcr-tcp/p/9170553.html
Copyright © 2020-2023  润新知