• 002:拨钟问题


    002:拨钟问题

    总时间限制: 
    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 


    my version WA发的
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #include<cstdlib>
    #include<cstring>
    #define DEBUG(x) cout << #x << " = " << x << endl
    using namespace std;
    //二进制数枚举
    short clocks[9];
    short clocksTemp[9];
    void copyClocks(short tar[],short src[]) {
        for(int i=0; i<9; i++) {
            clocksTemp[i]=clocks[i];
        }
    }
    bool areAllClear() {
        for(int i=0; i<9; i++) {
            if(clocksTemp[i]!=0)
                return false;
        }
        return true;
    }
    inline int getBit(int n,int i) {
        return (n>>i)&1;
    }
    char routs[9][9]= {"ABDE","ABC","BCEF"
                       ,"ADG","BDEFH","CFI"
                       ,"DEGH","GHI","EFHI"
                      };//todo
    void movement(int i) {
        int N=strlen(routs[i]);
        for(int k=0; k<N; k++){
            int p=routs[i][k]-'A';
            clocksTemp[p]=(clocksTemp[p]+1)%4;
        }
    }
    void debug(short a[],int n)
    {
        for(int i=0;i<n;i++){
            printf("%d ",a[i]);
        }
        printf("
    ");
    }
    vector<int> seq,seqt;
    int main() {
        freopen("in.txt","r",stdin);
        for(int i=0; i<9; i++) {
            scanf("%d",&clocks[i]);
        }
    //    printf("%d
    ",(1<<9)-1);
        for(int i=0; i<(1<<9); i++) {
                //枚举操作序列,每个操作最多只有一次
            int times=0;
            seqt.clear();
            copyClocks(clocksTemp,clocks);
            for(int j=0; j<9; j++) {
                    //获取操作序列
                if(getBit(i,j)) {
                    movement(j);
                    times++;
                    seqt.push_back(j+1);
                }
            }
            if(areAllClear()){
                if(seq.size()==0)seq=seqt;
                else if(seq.size()>seqt.size()){
                    seq=seqt;
                }
            }
        }
        for(int i=0;i<seq.size();i++){
            printf("%d",seq[i]);
            if(i!=seq.size()-1)printf(" ");
            else printf("
    ");
        }
        return 0;
    }

    perfect version

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #include<cstring>
    #include<cstdlib>
    #define DEBUG(x) cout << #x << " = " << x << endl
    #define INF 0x3f3f3f3f
    using namespace std;
    int moveTimes[9]={0};
    int resultTimes=INF;
    int result[9];
    int clocks[9],clocksTemp[9];
    char routs[9][9]= {"ABDE","ABC","BCEF"
                       ,"ADG","BDEFH","CFI"
                       ,"DEGH","GHI","EFHI"
                      };//todo
    void Enum(int p,int t)
    {
        if(t>resultTimes)return;
        if(p>=9){
            int times=0;
            memcpy(clocksTemp,clocks,sizeof(clocksTemp));
            for(int i=0;i<9;i++){
    //            times+=moveTimes[i];
                if(moveTimes[i])
                for(int j=0;routs[i][j];j++){
                    clocksTemp[routs[i][j]-'A']=(clocksTemp[routs[i][j]-'A']
                                            +moveTimes[i])%4;
                    times+=moveTimes[i];
                }
            }
            int i=0;
            for(;i<9;i++){
                if(clocksTemp[i])break;
            }
            if(i==9){
                if(resultTimes>times){
                    resultTimes=times;
                    memcpy(result,moveTimes,sizeof(result));
                }
            }
            return;
        }
        for(int i=0;i<4;i++){
            moveTimes[p]=i;
            Enum(p+1,t+i);
        }
        return;
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
        for(int i=0;i<9;i++){
            scanf("%d",&clocks[i]);
        }
        Enum(0,0);
        for(int i=0;i<9;i++){
            for(int j=0;j<result[i];j++){
                printf("%d ",i+1);
            }
        }
        return 0;
    }

    题意理解不准确。。。

  • 相关阅读:
    bzoj4476: [Jsoi2015]送礼物
    牛客练习赛42 E.热爆了
    bzoj3561: DZY Loves Math VI
    bzoj3560: DZY Loves Math V
    bzoj3512: DZY Loves Math IV
    bzoj3481: DZY Loves Math III
    使用WebUploader本地生成缩略图
    centos 7 安装JDK1.8
    APK反编译
    centos 7 配置pytorch运行环境
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9085175.html
Copyright © 2020-2023  润新知