WUST Online Judge - 2101: 拨钟问题

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("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/mcr-tcp/p/9170553.html