码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 6607 Time To Get Up(状态压缩+枚举)

时间:2017-08-03 18:49:16      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:i++   二进制   using   space   代码   --   return   题目   type   

题目网址: http://acm.hdu.edu.cn/showproblem.php?pid=6077

思路:

先预处理一下,将每个数字块的“X”看作1,“.”看作0,进行状态压缩转换成二进制数,用数组保存。再遍历每个块点的元素,枚举0-9看是否符合当前位数。

代码:

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 typedef long long ll;
 5 using namespace std;
 6 char clock[10][25];
 7 char str[30];
 8 int vis[10];
 9 int mp[15]={//分别对应0-9
10     110692758,
11     1114384,
12     101804166,
13     101802262,
14     10051856,
15     109601046,
16     109603222,
17     101777680,
18     110717334,
19     110715158
20 };
21 int main(){
22     int t,cur=0;
23     scanf("%d",&t);
24     while(t--){
25         for(int i=0; i<7; ++i) {
26             for(int j=0; j<21; ++j) {
27                 scanf(" %c",&clock[i][j]);
28             }
29         }
30         int cnt=0;
31         for(int k=0;k<4;k++){
32             memset(vis,0,sizeof(vis));//处理每个块之前都要初始化vis
33             for(int i=0;i<7;i++){
34                 for(int j=0;j<4;j++){
35                     int pos=27-i*4-j;//当前对应的右移数
36                     int w=clock[i][j+cnt]==X?1:0;
37                     for(int v=0;v<=9;v++){
38                         if(((mp[v]>>pos)&1)!=w){
39                             vis[v]=1;
40                         }
41                     }
42                 }
43             }
44             cnt+=5;//进入下一个模块
45             for(int i=0;i<10;i++){
46                 if(!vis[i]) printf("%d",i);
47             }
48             if(k==1)    cnt+=2,printf(":");// 略过“:”
49         }
50         printf("\n");
51     }
52     return 0;
53 }

 

HDU 6607 Time To Get Up(状态压缩+枚举)

标签:i++   二进制   using   space   代码   --   return   题目   type   

原文地址:http://www.cnblogs.com/uniles/p/7281142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!