超级密码
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也不能用来开启房门,这种情况也被认为密码不存在.
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\n",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\n",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 }