hdu 1226

超级密码

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2142    Accepted Submission(s): 675


Problem Description
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.

注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
 

 

Input
输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N<=5000)和C(2<=C<=16),其中N表示的是题目描述中的给定十进制整数,C是密码的进制数.测试数据的第二行是一个整数M(1<=M<=16),它表示构成密码的数字的数量,然后是M个数字用来表示构成密码的数字.两个测试数据之间会有一个空行隔开.

注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
 

 

Output
对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb please".

注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
 

 

Sample Input
3 22 10 3 7 0 1 2 10 1 1 25 16 3 A B C
 

 

Sample Output
110 give me the bomb please CCB
Hint
Hint
Huge input, scanf is recommended.
 

 

Author
Ignatius.L
 

 

Source
 
  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<queue>
  6 #include<algorithm>
  7 using namespace std;
  8 
  9 struct node
 10 {
 11     char num[501];
 12     int len;
 13 };
 14 queue<node>Q;
 15 bool use[17],hash[5002];
 16 int  n,c,m;
 17 
 18 int zc(node n1)
 19 {
 20     int i,mod=0,k;
 21     for(i=1;i<=n1.len;i++)
 22     {
 23         if(n1.num[i]>='0'&&n1.num[i]<='9')
 24             k=n1.num[i]-'0';
 25         else k=n1.num[i]-'A'+10;
 26         mod=(mod*c+k)%n;
 27     }
 28     return mod;
 29 }
 30 void print(node n1)
 31 {
 32     int i;
 33     for(i=1;i<=n1.len;i++)
 34         printf("%c",n1.num[i]);
 35     printf("
");
 36 }
 37 int bfs()
 38 {
 39     int i,k;
 40     struct node t,cur;
 41 
 42     for(i=0;i<16;i++)
 43     {
 44         if(use[i]==true)
 45         {
 46             t.len=1;
 47             if(i<=9)
 48             t.num[1]=i+'0';
 49             else t.num[1]=i-10+'A';
 50             k=i%n;
 51             if(k==0)
 52             {
 53                 if(i==0)continue;
 54                 if(i>=10)printf("%c
",i-10+'A');
 55                 else printf("%c
",i+'0');
 56                 return 1;
 57             }
 58             else if(hash[k]==false)
 59             {
 60                 hash[k]=true;
 61                 Q.push(t);
 62             }
 63         }
 64     }
 65     while(!Q.empty())
 66     {
 67         t=Q.front();
 68         Q.pop();
 69         if(t.len>=500)continue;
 70         for(i=0;i<16;i++)
 71         {
 72             if(use[i]==true)
 73             {
 74                 cur=t;
 75                 cur.len++;
 76                 if(i>=10)
 77                 cur.num[cur.len]=i+'A'-10;
 78                 else cur.num[cur.len]=i+'0';
 79 
 80                 k=zc(cur);
 81                 if(k==0)
 82                 {
 83                     print(cur);
 84                     return 1;
 85                 }
 86                 else if(hash[k]==false)
 87                 {
 88                     Q.push(cur);
 89                     hash[k]=true;
 90                 }
 91             }
 92         }
 93     }
 94     return -1;
 95 }
 96 int main()
 97 {
 98     int T,i,k;
 99     char cur[5];
100     scanf("%d",&T);
101     while(T--)
102     {
103         scanf("%d%d%d",&n,&c,&m);
104         memset(use,false,sizeof(use));
105         memset(hash,false,sizeof(hash));
106         while(!Q.empty())
107         {
108             Q.pop();
109         }
110         for(i=1;i<=m;i++)
111         {
112             scanf("%s",cur);
113             if(cur[0]>='0' && cur[0]<='9')
114                 use[cur[0]-'0']=true;
115             else if(cur[0]>='A')
116                 use[cur[0]-'A'+10]=true;
117         }
118         if(n==0)//!!!(⊙o⊙)…
119         {
120             if(use[0]==true)
121             {
122                 printf("0
");
123             }
124             else printf("give me the bomb please
");
125         }
126         else
127         {
128             k=bfs();
129             if(k==-1)printf("give me the bomb please
");
130         }
131     }
132     return 0;
133 }
原文地址:https://www.cnblogs.com/tom987690183/p/3641056.html