zoukankan      html  css  js  c++  java
  • hdu 1226 超级密码

    超级密码

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

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

    ----------------------

    暴力搜索 用字符匹配,直至符合或者超出范围

      1 #include<cstdio>
      2 #include<memory.h>
      3 #include<queue>
      4 #include<string>
      5 using namespace std;  //不加的话queue的声明无法通过
      6 int n,c;
      7 int visit[5001];//标记余数  n:0-5000
      8 int num[16];
      9 struct ss
     10 {
     11     int a[502];
     12     int len;
     13 };
     14 
     15 int mod(ss t)
     16 {
     17     int tt = 0;
     18     for(int i = 0; i < t.len; i++)
     19         tt = (tt * c + t.a[i]) % n;
     20     return tt;
     21 }
     22 
     23 void print(ss t)
     24 {
     25     for(int i = 0; i < t.len; i++)
     26     {
     27         if(t.a[i] <= 9)
     28             printf("%d",t.a[i]);
     29         else
     30             printf("%c",t.a[i] - 10 + 'A');
     31     }
     32     printf("
    ");
     33 }
     34 int bfs()
     35 {
     36     memset(visit,0,sizeof(visit));
     37     ss s;
     38     int modd;
     39     queue<ss> q;
     40     for(int i = 1; i < 16; i++)
     41     {
     42         if(num[i])
     43         {
     44             s.a[0] = i;
     45             s.len = 1;
     46             modd = mod(s);
     47             if(!modd)  //模为0
     48             {
     49                 print(s);
     50                 return 1;
     51             }
     52             else
     53             {
     54                 //q.push(s);
     55                 if(!visit[modd])
     56                 {
     57                     visit[modd] = 1;
     58                     q.push(s);
     59                 }
     60             }
     61         }
     62     }
     63     while(!q.empty())
     64     {
     65         s = q.front();
     66         q.pop();
     67         for(int i = 0; i < 16; i++)
     68         {
     69             if(num[i])
     70             {
     71                 s.a[s.len] = i;
     72                 s.len++;
     73                 modd = mod(s);
     74                 if(!modd)
     75                 {
     76                     print(s);
     77                     return 1;
     78                 }
     79                 else
     80                 {
     81                     if(!visit[modd] && s.len < 499)
     82                     {
     83                         visit[modd] = 1;
     84                         q.push(s);
     85                     }
     86                 }
     87 
     88                 s.len--; //恢复
     89             }
     90         }
     91 
     92     }
     93     return 0;
     94 }
     95 
     96 int main()
     97 {
     98     freopen("input.txt","r",stdin);
     99     int T,m;
    100     char ch[2];  //注意字符存取 后面要有一个空间存取''
    101     scanf("%d",&T);
    102     while(T--)
    103     {
    104         scanf("%d%d",&n,&c);
    105         scanf("%d",&m);
    106         memset(num,0,sizeof(num));
    107         for(int i = 0; i < m; i++)
    108         {
    109             scanf("%s",&ch);
    110             if(ch[0] >= '0' && ch[0] <='9')
    111                 num[ch[0]-'0'] = 1;
    112             else
    113                 num[ch[0]-'A'+10] = 1;
    114         }
    115 
    116         if(n == 0)
    117         {
    118             if(num[0])
    119                 printf("%d
    ",0);
    120             else
    121                 printf("give me the bomb please
    ");
    122         }
    123         else
    124         {
    125             bool b = bfs();
    126             if(!b)
    127                 printf("give me the bomb please
    ");
    128         }
    129 
    130     }
    131     return 0;
    132 }
  • 相关阅读:
    归并排序模板
    树状数组模板
    KMP模板
    拓扑排序模板
    分布式唯一ID生成算法-雪花算法
    【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
    一起来学Spring Cloud | 第八章:消息总线(Spring Cloud Bus)
    我为什么会成为一个程序猿
    一起来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config)
    一起来学Spring Cloud | 第六章:服务网关 ( Zuul)
  • 原文地址:https://www.cnblogs.com/imLPT/p/3854480.html
Copyright © 2011-2022 走看看