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; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com