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
翻译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