描述
有9个时钟,排成一个3*3的矩阵。
现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 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<iostream>
#include<cstring>
using namespace std;
int main(){
int sz[9];
int i,j,sum;
for(i = 0;i < 9; ++i)
scanf("%d",sz + i);
for(int i1 = 0;i1 < 4; ++i1){
for(int i2 = 0;i2 < 4; ++i2){
for(int i3 = 0;i3 < 4; ++i3){
for(int i4 = 0;i4 < 4; ++i4){
for(int i5 = 0;i5 < 4; ++i5){
for(int i6 = 0;i6 < 4; ++i6){
for(int i7 = 0;i7 < 4; ++i7){
for(int i8 = 0;i8 < 4; ++i8){
for(int i9 = 0;i9 < 4; ++i9){
sum = 0;
sum += (sz[0] + i1 + i2 + i4) % 4;
sum += (sz[1] + i1 + i2 + i3 + i5) % 4;
sum += (sz[2] + i2 + i3 + i6) % 4;
sum += (sz[3] + i1 + i4 + i5 + i7) % 4;
sum += (sz[4] + i1 + i3 + i5 + i7 + i9) % 4;
sum += (sz[5] + i3 + i5 + i6 +i9) % 4;
sum += (sz[6] + i4 + i7 + i8) % 4;
sum += (sz[7] + i5 + i7 + i8 + i9) % 4;
sum += (sz[8] + i6 + i8 + i9) % 4;
if(sum == 0){
while(i1){
printf("1 ");
--i1;
}
while(i2){
printf("2 ");
--i2;
}
while(i3){
printf("3 ");
--i3;
}
while(i4){
printf("4 ");
--i4;
}
while(i5){
printf("5 ");
--i5;
}
while(i6){
printf("6 ");
--i6;
}
while(i7){
printf("7 ");
--i7;
}
while(i8){
printf("8 ");
--i8;
}
while(i9){
printf("9 ");
--i9;
}
goto END;
}
}
}
}
}
}
}
}
}
}
END : return 0;
}
方法一:按顺序从小到大枚举所有可能。
//略
方法二:类似熄灯问题,关系较复杂,容易错,不适合。