题目:拨钟问题
1166:拨钟问题
描述
有9个时钟,排成一个3*3的矩阵。
|-------| |-------| |-------|
| | | | | | |
|---O | |---O | | O |
| | | | | |
|-------| |-------| |-------|A B C |-------| |-------| |-------|
| | | | | |
| O | | O | | O |
| | | | | | | | |
|-------| |-------| |-------|D E F |-------| |-------| |-------|
| | | | | |
| O | | O---| | O |
| | | | | | | |
|-------| |-------| |-------|G H I
(图 1)
现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟
1 ABDE2 ABC3 BCEF4 ADG5 BDEFH6 CFI7 DEGH8 GHI9 EFHI
输入
9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。
输出
输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。
样例输入
3 3 0
2 2 2
2 1 2
样例输出
4 5 8 9
思路:枚举,也就是暴力,注意一个方法最多使用三次。
#include <string.h>
#include <stdio.h>
#define FOR(x) for(x=0;x<=3;x++)
int main()
{int i,a[10],b[10],c[10];for(i=1;i<=9;i++)scanf("%d",&a[i]);FOR(b[1])FOR(b[2])FOR(b[3])FOR(b[4])FOR(b[5])FOR(b[6])FOR(b[7])FOR(b[8])FOR(b[9]){c[1]=(a[1]+b[1]+b[2]+b[4])%4;c[2]=(a[2]+b[1]+b[2]+b[3]+b[5])%4;c[3]=(a[3]+b[2]+b[3]+b[6])%4;c[4]=(a[4]+b[1]+b[4]+b[5]+b[7])%4;c[5]=(a[5]+b[1]+b[3]+b[5]+b[7]+b[9])%4;c[6]=(a[6]+b[3]+b[5]+b[6]+b[9])%4;c[7]=(a[7]+b[4]+b[7]+b[8])%4;c[8]=(a[8]+b[5]+b[7]+b[8]+b[9])%4;c[9]=(a[9]+b[6]+b[8]+b[9])%4;if(c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9]==0){for(i=0;i<b[1];i++) printf("1 ");for(i=0;i<b[2];i++) printf("2 ");for(i=0;i<b[3];i++) printf("3 ");for(i=0;i<b[4];i++) printf("4 ");for(i=0;i<b[5];i++) printf("5 ");for(i=0;i<b[6];i++) printf("6 ");for(i=0;i<b[7];i++) printf("7 ");for(i=0;i<b[8];i++) printf("8 ");for(i=0;i<b[9];i++) printf("9 ");printf("\n");return(0);}}
}