POJ 1166 The Clocks 拨钟问题

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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值