openjudge 2814:拨钟问题

2814:拨钟问题

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

有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>
using namespace std;
bool isOk(int tmp[]){
	for(int i=0;i<9;++i){
		if(tmp[i]!=0) return false;
	}
	return true;
}

void oj_1_2(){
	int a[10];
	for(int i=0;i<9;++i){
		cin>>a[i];
	}

	int tmp[10];
	memset(tmp,0,sizeof(tmp));
	for(int m1=0;m1<4;++m1){
		for(int m2=0;m2<4;++m2){
			for(int m3=0;m3<4;++m3){
				for(int m4=0;m4<4;++m4){
					for(int m5=0;m5<4;++m5){
						for(int m6=0;m6<4;++m6){
							for(int m7=0;m7<4;++m7){
								for(int m8=0;m8<4;++m8){
									for(int m9=0;m9<4;++m9){
										tmp[0]=(a[0]+m1+m2+m4)%4;//A
										tmp[1]=(a[1]+m1+m2+m3+m5)%4;//B
										tmp[2]=(a[2]+m2+m3+m6)%4;//C
										tmp[3]=(a[3]+m1+m4+m5+m7)%4;//D
										tmp[4]=(a[4]+m1+m3+m5+m7+m9)%4;//E
										tmp[5]=(a[5]+m3+m5+m6+m9)%4;//F
										tmp[6]=(a[6]+m4+m7+m8)%4;//G
										tmp[7]=(a[7]+m5+m7+m8+m9)%4;//H
										tmp[8]=(a[8]+m6+m8+m9)%4;//I
										if(isOk(tmp)){//因为是从小到大枚举,所以最先满足的肯定是最短的移动序列
											for(int i=0;i<m1;++i) cout<<"1 ";
											for(int i=0;i<m2;++i) cout<<"2 ";
											for(int i=0;i<m3;++i) cout<<"3 ";
											for(int i=0;i<m4;++i) cout<<"4 ";
											for(int i=0;i<m5;++i) cout<<"5 ";
											for(int i=0;i<m6;++i) cout<<"6 ";
											for(int i=0;i<m7;++i) cout<<"7 ";
											for(int i=0;i<m8;++i) cout<<"8 ";
											for(int i=0;i<m9;++i) cout<<"9 ";
											cout<<endl;
											goto END;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	END:
		return;

}

int main(){
	oj_1_2();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值