超级密码
Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 4 Accepted Submission(s) : 0
Problem Description
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
Input
输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N& lt;=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[/hint] Huge input, scanf is recommended.
ac代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=550; 7 int num[20]; 8 struct Node{ 9 int s[MAXN]; 10 int len; 11 }; 12 int M,C,N; 13 int vis[5050]; 14 int mod(Node a){ 15 int x=0; 16 for(int i=0;i<a.len;i++){ 17 x=(x*C+a.s[i])%N; 18 } 19 return x; 20 } 21 void print_ans(Node a){ 22 for(int i=0;i<a.len;i++){ 23 if(a.s[i]>=0&&a.s[i]<=9)printf("%c",a.s[i]+'0'); 24 else printf("%c",a.s[i]-10+'A'); 25 } 26 puts(""); 27 } 28 void bfs(){ 29 memset(vis,0,sizeof(vis)); 30 queue<Node>dl; 31 Node a; 32 a.len=1; 33 int md; 34 for(int i=0;i<M;i++){ 35 a.s[0]=num[i]; 36 md=mod(a); 37 //printf("%d ",md); 38 if(vis[md]||num[i]==0)continue; 39 if(md==0&&num[i]){ 40 printf("%d ",num[i]); 41 return; 42 } 43 // printf("%d ",md); 44 vis[md]=1; 45 dl.push(a); 46 } 47 while(!dl.empty()){ 48 a=dl.front(); 49 dl.pop(); 50 for(int i=0;i<M;i++){ 51 if(a.len==1&&a.s[0]==0)continue; 52 a.s[a.len]=num[i]; 53 a.len++; 54 //puts("**"); 55 md=mod(a); 56 // printf("%d ",md); 57 if(vis[md]||a.len>500){ 58 a.len--;//这里少了这个错的啊。。。。。无奈。。。。。 59 continue; 60 } 61 // print_ans(a); 62 if(md==0){ 63 64 print_ans(a); 65 return; 66 } 67 vis[md]=1; 68 dl.push(a); 69 a.len--; 70 } 71 } 72 puts("give me the bomb please"); 73 } 74 int main(){ 75 int T; 76 scanf("%d",&T); 77 char s[5]; 78 while(T--){ 79 scanf("%d%d%d",&N,&C,&M); 80 for(int i=0;i<M;i++){ 81 scanf("%s",s); 82 if(s[0]>='0'&&s[0]<='9')num[i]=s[0]-'0'; 83 else num[i]=s[0]-'A'+10; 84 // printf("%d ",num[i]); 85 } 86 sort(num,num+M); 87 if(N)bfs(); 88 else if(!num[0])puts("0"); 89 else puts("give me the bomb please"); 90 } 91 return 0; 92 }
wa代码,求改正。。。。
感觉没错啊;
代码:
1 #include<stdio.h> 2 #include<string> 3 #include<queue> 4 #include<string.h> 5 #include<algorithm> 6 #define mem(a) memset(a,0,sizeof(a)) 7 using namespace std; 8 const int MAXN=1e4+10; 9 int cmp(char a,char b){ 10 /*if(a<b)return 1; 11 else return 0;*/ 12 return a<b; 13 } 14 int vis[MAXN],pre[MAXN]; 15 char num[20]; 16 int nu[20]; 17 char al[MAXN]; 18 int n,m,C; 19 void print_ans(){ 20 int r=0; 21 string ans; 22 while(ans.empty()||r!=0){ 23 ans+=al[r]; 24 r=pre[r]; 25 } 26 reverse(ans.begin(),ans.end()); 27 puts(ans.c_str()); 28 } 29 void bfs(){ 30 queue<int>dl; 31 dl.push(0); 32 while(!dl.empty()){ 33 int f1,f2; 34 f1=dl.front();//** 35 dl.pop(); 36 for(int i=0;i<m;i++){ 37 if(nu[i]==0&&f1==0)continue; 38 f2=(f1*C+nu[i])%n; 39 if(vis[f2])continue; 40 pre[f2]=f1; 41 al[f2]=num[i]; 42 if(f2==0){ 43 //printf("%d %d ",f1,f1*C+nu[i]); 44 print_ans(); 45 return; 46 } 47 vis[f2]=1; 48 dl.push(f2); 49 } 50 } 51 puts("give me the bomb please"); 52 } 53 int main(){ 54 int T; 55 scanf("%d",&T); 56 while(T--){ 57 mem(vis);mem(pre);mem(al); 58 char x[5]; 59 scanf("%d%d%d",&n,&C,&m); 60 for(int i=0;i<m;i++){ 61 scanf("%s",x); 62 num[i]=x[0]; 63 //printf("%c ",num[i]); 64 } 65 sort(num,num+m); 66 int o=0; 67 for(int i=0;i<m;i++){ 68 if(num[i]>='A'&&num[i]<='Z')nu[i]=10+num[i]-'A'; 69 else nu[i]=num[i]-'0'; 70 if(num[i]=='0')o=1; 71 //printf("%c %d ",num[i],nu[i]); 72 } 73 if(n!=0)bfs(); 74 else if(o)puts("0"); 75 else puts("give me the bomb please"); 76 } 77 return 0; 78 }