zoukankan      html  css  js  c++  java
  • UVALive 6269 Digital Clock --枚举,模拟

    题意:说不清楚,自己看吧,太恶心。

    这题真是SB了,当时看了一下以为乱搞就好了,于是开始动手拍,结果拍了好几个小时都没拍出来,而且越想越想不通,直接把自己绕进去了,结果gg了。

    总结:甭管什么题,想清楚了再拍。其实当初绕进去的时候,应该换个思路重新来一遍更好

    解法:枚举时间从00:00~23:59,数字显示用7位01串表示,如图:

    ,每次检查与给出的观察序列是否能够逻辑一致。

    关键在check部分,这部分我都写了注释了,应该比较易懂了。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <vector>
    using namespace std;
    #define N 100007
    
    string num[12] = {"1110111","0010010","1011101","1011011",
    "0111010","1101011","1101111","1010010","1111111","1111011"};
    
    struct node
    {
        int mi,sec;
        node(int _mi,int _sec)
        {
            mi = _mi;
            sec = _sec;
        }
        node(){}
    }p[56];
    int h1[5][8],h2[5][8],broken[5][8];
    vector<node> ans;
    
    int get(int *a,int n)
    {
        for(int i=0;i<7;i++)
            a[i] = num[n][i] - '0';
    }
    
    void add(node &x,int val)
    {
        x.sec += val;
        x.mi += x.sec/60;
        x.mi%=24;
        x.sec%=60;
    }
    
    void getH1(node ka)         //观察的
    {
        memset(h1,0,sizeof(h1));
        get(h1[0],ka.mi/10);
        get(h1[1],ka.mi%10);
        get(h1[2],ka.sec/10);
        get(h1[3],ka.sec%10);
    }
    
    void getH2(node ka)         //枚举的
    {
        memset(h2,0,sizeof(h2));
        get(h2[0],ka.mi/10);
        get(h2[1],ka.mi%10);
        get(h2[2],ka.sec/10);
        get(h2[3],ka.sec%10);
    }
    
    bool check()
    {
        int i,j;
        for(i=0;i<4;i++)
        {
            for(j=0;j<7;j++)
            {
                if(h1[i][j] == 0 && h2[i][j] == 1) //观察到没有,现在枚举到有 -> 坏了
                {
                    if(broken[i][j] == 0)  //还不知道坏没坏
                        broken[i][j] = -1;  //定义为坏了
                    else if(broken[i][j] == 1)  //与前面矛盾
                        return false;
                }
                else if(h1[i][j] == 1 && h2[i][j] == 0) //观察到有,枚举的没有,那么这个枚举的不行
                    return false;
                else if(h1[i][j] == 1 && h2[i][j] == 1) //都有
                {
                    if(broken[i][j] == 0)  //还未定义好坏
                        broken[i][j] = 1;  //肯定是好的
                    else if(broken[i][j] == -1)  //前面说坏了,矛盾
                        return false;
                }
            }
        }
        return true;
    }
    
    int main()
    {
        int n,i,j;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
                scanf("%d:%d",&p[i].mi,&p[i].sec);
            ans.clear();
            for(int H=0;H<=23;H++)
            {
                for(int M=0;M<=59;M++)
                {
                    node tmp;
                    tmp.mi = H,tmp.sec = M;
                    int flag = 1;
                    memset(broken,0,sizeof(broken));
                    for(i=0;i<n;i++)
                    {
                        node now = tmp;
                        add(now,i);
                        getH1(p[i]);
                        getH2(now);
                        if(!check())
                        {
                            flag = 0;
                            break;
                        }
                    }
                    if(flag)
                        ans.push_back(node(H,M));
                }
            }
            if(ans.size() == 0)
                puts("none");
            else
            {
                printf("%02d:%02d",ans[0].mi,ans[0].sec);
                for(i=1;i<ans.size();i++)
                    printf(" %02d:%02d",ans[i].mi,ans[i].sec);
                puts("");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    GCD
    hexo 部署 githubPage 部署不了的问题
    vim 常见操作
    linux 常见目录的作用
    cd 简化命令
    linux 系统运行级别
    APNIC IP 库
    linux 安装ssh
    linux
    Android知识点总结
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3920284.html
Copyright © 2011-2022 走看看