超级密码(bfs)
超級密碼
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 }?
轉載于:https://www.cnblogs.com/handsomecui/p/4865554.html
總結
- 上一篇: 数据结构之选择排序:堆排序
- 下一篇: 计组之总线:3、总线操作和定时(同步定时