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

Posted ventricle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6607 Time To Get Up(状态压缩+枚举)相关的知识,希望对你有一定的参考价值。

题目网址: 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(状态压缩+枚举)的主要内容,如果未能解决你的问题,请参考以下文章

hdu6607 min25筛+杜教筛+伯努利数求k次方前缀和

Powershell Exchange Server UP Time

[HDU2577]How to Type(DP)

翻译over an extended period of time-higher doses,i.e up to 2 capsules 3 times daily are possible

Get Up to 20% off lucky code for 07 rs gold buying from Rsorder facebook 5.20-5.30

HDU1081 To The Max