poj(1166)——拨钟问题

博客详细介绍了POJ 1166题目中的拨钟问题,指出其核心是通过枚举来求解问题。内容可能包括问题背景、解题思路、枚举算法的实现细节等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

又是一道枚举题。。

9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。
输出
输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。

操作:

移动    影响的时钟
 
 1         ABDE
 2         ABC
 3         BCEF
 4         ADG
 5         BDEFH
 6         CFI
 7         DEGH
 8         GHI
 9         EFHI    

思路:

长考了好久,然后发现只需要进行枚举次数就好了,因为每个时钟来说它最多进行4次改变(1-2-3-0),所以对9个操作进行枚举,并且枚举它们分别被操作了几次,然后就好啦,就和熄灯问题一样,求出每个点的状态就好了。

#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<time.h>
using namespace std;
typedef long ll;
typedef unsigned long ULL;
#define pi acos(-1.0)
#define Ex exp(1.0)
#define maxn 11
int a[maxn],mp[maxn];
int main(){
    for(int i=1;i<=9;i++) scanf("%d",&a[i]);
    int flag=0;
    for(int i=0;i<=3;i++){  //1
        for(int j=0;j<=3;j++){  //2
            for(int k=0;k<=3;k++){      //3
                for(int l=0;l<=3;l++){      //4
                    for(int m=0;m<=3;m++){      //5
                        for(int n=0;n<=3;n++){      //6
                            for(int o=0;o<=3;o++){      //7
                                for(int t=0;t<=3;t++){      //8
                                    for(int q=0;q<=3;q++){      //9
                                        mp[1]=(a[1]+i+j+l)%4;
                                        mp[2]=(a[2]+i+j+k+m)%4;
                                        mp[3]=(a[3]+j+k+n)%4;
                                        mp[4]=(a[4]+i+l+m+o)%4;
                                        mp[5]=(a[5]+i+k+m+o+q)%4;
                                        mp[6]=(a[6]+k+m+n+q)%4;
                                        mp[7]=(a[7]+l+o+t)%4;
                                        mp[8]=(a[8]+m+o+t+q)%4;
                                        mp[9]=(a[9]+n+t+q)%4;
                                        sort(mp+1,mp+10);
                                        if(mp[1]==mp[9]&&mp[1]==0){
                                            int ff=0;
                                            if(!ff&&i) {printf("1");ff=1;for(int p=1;p<i;p++) printf(" 1");}
                                            else for(int p=0;p<i;p++) printf(" 1");
                                            if(!ff&&j) {printf("2");ff=1;for(int p=1;p<j;p++) printf(" 2");}
                                            else for(int p=0;p<j;p++) printf(" 2");
                                            if(!ff&&k) {printf("3");ff=1;for(int p=1;p<k;p++) printf(" 3");}
                                            else for(int p=0;p<k;p++) printf(" 3");
                                            if(!ff&&l) {printf("4");ff=1;for(int p=1;p<l;p++) printf(" 4");}
                                            else for(int p=0;p<l;p++) printf(" 4");
                                            if(!ff&&m) {printf("5");ff=1;for(int p=1;p<m;p++) printf(" 5");}
                                            else for(int p=0;p<m;p++) printf(" 5");
                                            if(!ff&&n) {printf("6");ff=1;for(int p=1;p<n;p++) printf(" 6");}
                                            else for(int p=0;p<n;p++) printf(" 6");
                                            if(!ff&&o) {printf("7");ff=1;for(int p=1;p<o;p++) printf(" 7");}
                                            else for(int p=0;p<o;p++) printf(" 7");
                                            if(!ff&&t) {printf("8");ff=1;for(int p=1;p<t;p++) printf(" 8");}
                                            else for(int p=0;p<t;p++) printf(" 8");
                                            if(!ff&&q) {printf("9");ff=1;for(int p=1;p<q;p++) printf(" 9");}
                                            else for(int p=0;p<q;p++) printf(" 9");
                                            printf("\n");
                                            flag=1;
                                            break;
                                        }
                                        if(flag) break;
                                    }
                                    if(flag) break;
                                }
                                if(flag) break;
                            }
                            if(flag) break;
                        }
                        if(flag) break;
                    }
                    if(flag) break;
                }
                if(flag) break;
            }
            if(flag) break;
        }
        if(flag) break;
    }
    #ifndef ONLINE_JUDGE
    system("pause");
    #endif
}
/*
3 3 0 
2 2 2 
2 1 2 
*/


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值