• hdu 1226


    超级密码

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 2142    Accepted Submission(s): 675


    Problem Description
    Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
    密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.

    注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
     

     

    Input
    输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N<=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
    Huge input, scanf is recommended.
     

     

    Author
    Ignatius.L
     

     

    Source
     
      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<queue>
      6 #include<algorithm>
      7 using namespace std;
      8 
      9 struct node
     10 {
     11     char num[501];
     12     int len;
     13 };
     14 queue<node>Q;
     15 bool use[17],hash[5002];
     16 int  n,c,m;
     17 
     18 int zc(node n1)
     19 {
     20     int i,mod=0,k;
     21     for(i=1;i<=n1.len;i++)
     22     {
     23         if(n1.num[i]>='0'&&n1.num[i]<='9')
     24             k=n1.num[i]-'0';
     25         else k=n1.num[i]-'A'+10;
     26         mod=(mod*c+k)%n;
     27     }
     28     return mod;
     29 }
     30 void print(node n1)
     31 {
     32     int i;
     33     for(i=1;i<=n1.len;i++)
     34         printf("%c",n1.num[i]);
     35     printf("
    ");
     36 }
     37 int bfs()
     38 {
     39     int i,k;
     40     struct node t,cur;
     41 
     42     for(i=0;i<16;i++)
     43     {
     44         if(use[i]==true)
     45         {
     46             t.len=1;
     47             if(i<=9)
     48             t.num[1]=i+'0';
     49             else t.num[1]=i-10+'A';
     50             k=i%n;
     51             if(k==0)
     52             {
     53                 if(i==0)continue;
     54                 if(i>=10)printf("%c
    ",i-10+'A');
     55                 else printf("%c
    ",i+'0');
     56                 return 1;
     57             }
     58             else if(hash[k]==false)
     59             {
     60                 hash[k]=true;
     61                 Q.push(t);
     62             }
     63         }
     64     }
     65     while(!Q.empty())
     66     {
     67         t=Q.front();
     68         Q.pop();
     69         if(t.len>=500)continue;
     70         for(i=0;i<16;i++)
     71         {
     72             if(use[i]==true)
     73             {
     74                 cur=t;
     75                 cur.len++;
     76                 if(i>=10)
     77                 cur.num[cur.len]=i+'A'-10;
     78                 else cur.num[cur.len]=i+'0';
     79 
     80                 k=zc(cur);
     81                 if(k==0)
     82                 {
     83                     print(cur);
     84                     return 1;
     85                 }
     86                 else if(hash[k]==false)
     87                 {
     88                     Q.push(cur);
     89                     hash[k]=true;
     90                 }
     91             }
     92         }
     93     }
     94     return -1;
     95 }
     96 int main()
     97 {
     98     int T,i,k;
     99     char cur[5];
    100     scanf("%d",&T);
    101     while(T--)
    102     {
    103         scanf("%d%d%d",&n,&c,&m);
    104         memset(use,false,sizeof(use));
    105         memset(hash,false,sizeof(hash));
    106         while(!Q.empty())
    107         {
    108             Q.pop();
    109         }
    110         for(i=1;i<=m;i++)
    111         {
    112             scanf("%s",cur);
    113             if(cur[0]>='0' && cur[0]<='9')
    114                 use[cur[0]-'0']=true;
    115             else if(cur[0]>='A')
    116                 use[cur[0]-'A'+10]=true;
    117         }
    118         if(n==0)//!!!(⊙o⊙)…
    119         {
    120             if(use[0]==true)
    121             {
    122                 printf("0
    ");
    123             }
    124             else printf("give me the bomb please
    ");
    125         }
    126         else
    127         {
    128             k=bfs();
    129             if(k==-1)printf("give me the bomb please
    ");
    130         }
    131     }
    132     return 0;
    133 }
  • 相关阅读:
    Apache Commons 工具集使用简介
    程序员最核心的竞争力是什么?
    开发FTP不要使用sun.net.ftp.ftpClient
    Eclipse和MyEclipse工程描述符.classpath和.project和.mymetadata详解(转)
    MAC OS X显示.开头的文件_苹果操作系统显示隐藏文件命令
    再探二分查找
    二叉树的各种操作
    【java】求两个字符串的最长公共子串
    【Java】数组不能通过toString方法转为字符串
    【C语言】数组名传递给函数,数组的sizeof变为4的原因
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3641056.html
Copyright © 2020-2023  润新知