码迷,mamicode.com
首页 > 其他好文 > 详细

超级密码(bfs)

时间:2015-10-10 01:37:50      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

超级密码

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.
 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 }

 

超级密码(bfs)

标签:

原文地址:http://www.cnblogs.com/handsomecui/p/4865554.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!