POJ 1166 The Clocks 拨钟问题
描述
有9个时钟,排成一个3*3的矩阵。
现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
输入
9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。
输出
输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。
样例输入
3 3 0
2 2 2
2 1 2
样例输出
4 5 8 9
思路
每一个移动方案可以使钟表指针转动90°,拨动4次。等于没有变,所以每个方案只有4种情况,即不用,用一次两次三次。共有9种方案,4^9=262144,不会超时。可以枚举。
每个钟表移动后等于最初值加上移动值,用该值模4即为最后的时间。因为钟表的值都大于0,所以只需所有钟表移动后的值相加等于0,就可判断所有钟表都指向12点。
数组的名字最后起短点,不然好麻烦
不过我不太明白怎么判断移动次数最小,希望各位大犇教教本蒟蒻 %%% orz
代码
#include<iostream>
using namespace std;
int ori[10],button[10],now[10];
int main()
{
for(int i=1;i<=9;i++)
cin>>ori[i];
for(button[1]=0;button[1]<4;button[1]++) //太长,缩进就装不下了
for(button[2]=0;button[2]<4;button[2]++) //循环9种方案
for(button[3]=0;button[3]<4;button[3]++)
for(button[4]=0;button[4]<4;button[4]++)
for(button[5]=0;button[5]<4;button[5]++)
for(button[6]=0;button[6]<4;button[6]++)
for(button[7]=0;button[7]<4;button[7]++)
for(button[8]=0;button[8]<4;button[8]++)
for(button[9]=0;button[9]<4;button[9]++)
{
now[1] = (ori[1] + button[1] + button[2] + button[4])%4; //计算当前钟表的值
now[2] = (ori[2] + button[1] + button[2] + button[3] + button[5])%4;
now[3] = (ori[3] + button[2] + button[3] + button[6])%4;
now[4] = (ori[4] + button[1] + button[4] + button[5] + button[7])%4;
now[5] = (ori[5] + button[1] + button[3] + button[5] + button[7] + button[9])%4;
now[6] = (ori[6] + button[3] + button[5] + button[6] + button[9])%4;
now[7] = (ori[7] + button[4] + button[7] + button[8])%4;
now[8] = (ori[8] + button[5] + button[7] + button[8] + button[9])%4;
now[9] = (ori[9] + button[6] + button[8] + button[9])%4;
if(now[1]+now[2]+now[3]+now[4]+now[5]+now[6]+now[7]+now[8]+now[9]==0) //判断是否所有都为0
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=button[i];j++) //输出
cout<<i<<" ";
}
return 0; //有一个方案可行就退出
}
}
return 0;
}