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