• 超级密码(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
    ",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 }
  • 相关阅读:
    持久化 轻量数据
    ObjectiveC 中 +load 与 +initialize
    对待“技术“与“管理”的想法
    springcloudalibaba之Nacos
    Docker上安装Redis
    Docker安装Minio
    基于Docker部署Nacos
    支付宝微信合单支付
    Nacos安装和配置
    windows常用软件安装和配置
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4865554.html
Copyright © 2020-2023  润新知