百练#2814拨钟问题

描述
有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;
} 

方法一:按顺序从小到大枚举所有可能。

//略

方法二:类似熄灯问题,关系较复杂,容易错,不适合。

发布了53 篇原创文章 · 获赞 0 · 访问量 732

猜你喜欢

转载自blog.csdn.net/weixin_38894974/article/details/104274340