2814 播种问题

有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         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>
#include <algorithm>
using namespace std;
int main()
{
	int a[10],maxx=99999,t[9]= {0};
	for(int i=0; i<9; i++)
		{
			cin>>a[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++)
											{
												if((i1+i2+i4+a[0])%4==0&&(i1+i2+i3+i5+a[1])%4==0&&(i3+i2+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)
													{
														int sum=i1+i2+i3+i4+i5+i6+i7+i8+i9;
														if(maxx>sum)
															{
																maxx=sum;
																t[0]=i1;
																t[1]=i2;
																t[2]=i3;
																t[3]=i4;
																t[4]=i5;
																t[5]=i6;
																t[6]=i7;
																t[7]=i8;
																t[8]=i9;
															}
													}
											}
		}

	for (int cur = 0; cur < 9; cur++)
		while(t[cur]--)
			cout<<cur + 1<<" ";

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值