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; }