超级密码

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

Huge input, scanf is recommended.

 

Author

Ignatius.L
 
 
//好题啊,唉,咋就是想不到呢,这bfs太棒了
思路是这样的,bfs ,一位一位的填数字,但是,如果暴力,可以想到,最大有16个数填,暴力填个几位估计就不行了,别说密码有500位之多了。
必须将暴力的方式优化,不能无脑暴力,最关键的就是这个了:
填数字的方法是这样的: 先搜出所有的一位数,之后的bfs是在一位数之后追加数字变为二位数,这样重复。有人可能想到的是在一位数前面加数字,变为二位数,这样其实不好弄。。
如果,a 和 b 余 n 相同,那在 a 和 b 之后追加任何数余 c 都是相同的,所以 a 和 b 中较大的没必要入队了(题目要求最小的)
所以,这下,余数最大是 5000 ,所以最多就 bfs 5000 次了,快的害怕
然后就是具体实现了,有几个技巧,像数组模拟队列,sort 一下保证最小,求余的方法,递归输出结果
 
 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; struct Node
{
int mod; //余
int digit; //该位的值
int pre; //前一个是
int step; //第几位了
}Q[],init={,,-,};//初始状态 int n,c,m;
int num[]; // 16 个数
int use[]; //余 ,标记 void print(int p)
{
if (Q[p].pre==-)
return;
else
print(Q[p].pre);
if (Q[p].digit<)
printf("%c",Q[p].digit+'');
else
printf("%c",Q[p].digit-+'A');
} void bfs()
{
memset(use,,sizeof(use));
int head=,tail=;
Q[]=init;
int ok=;
while (head!=tail)
{
if (ok) break;
Node x =Q[head];
for (int i=;i<m;i++)
{
int yu = (x.mod*c+num[i])%n;
if (use[yu]||(x.pre==-&&num[i]==)||x.step>=) continue;
Q[tail].mod=yu;
Q[tail].digit=num[i];
Q[tail].pre=head;
Q[tail].step=x.step+;
use[yu]=;
if (yu==)
{
print(tail);
ok=;
break;
}
tail++;
}
head++;
}
if (ok)
printf("\n");
else
printf("give me the bomb please\n");
} int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&n,&c,&m);
for (int i=;i<m;i++)
{
char tt[];
scanf("%s",tt);
if (tt[]>=''&&tt[]<='')
num[i]=tt[]-'';
else
num[i]=tt[]-'A'+;
}
sort(num,num+m);
if (n==)
{
if (num[]==)
printf("0\n");
else
printf("give me the bomb please\n");
}
else
bfs();
}
return ;
}

hdu_1226超级密码(BFS)的更多相关文章

  1. hdu.1226.超级密码(bfs)

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. 超级密码(bfs)

    超级密码 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  3. HDOJ 1226 超级密码(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. & ...

  4. hdu1226 超级密码 (BFS,里面用了大数取余原理)

    Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...

  5. HDU1226:超级密码(BFS)

    Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...

  6. HDU 1226 超级密码(BFS) (还需研究)

    Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Desc ...

  7. hdu1226超级密码 bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1226/ 题目大意是:寻找一个五百位之内的C进制密码,该密码是N的正整数倍,而且只能用给定的数构成密码,求这样的密 ...

  8. 超级密码 hdu1226 bfs

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. HDU 1226 超级密码(数学 bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others)    ...

随机推荐

  1. linux系统清理僵尸进程记录

    在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程.  在fork()/execve()过程中,假设子进程结束时父进程仍存在, ...

  2. 【Hadoop】HDFS冗余数据块的自动删除

    HDFS冗余数据块的自动删除 在日常维护hadoop集群的过程中发现这样一种情况: 某个节点由于网络故障或者DataNode进程死亡,被NameNode判定为死亡, HDFS马上自动开始数据块的容错拷 ...

  3. 计算机速度GHz等于每秒多少次

    这个是没有对比关系的.需要看处理器的微指令.计算机的GHz指的是CPU的时钟频率,不同的指令需要的时钟个数是不同的,列如,从内存读一个数据,一般需要4个时钟周期,而进行一次8位数的加法运算,一般需要1 ...

  4. 2017.4.18 慕课网-spring事务管理总结

    1.课程目标 事务回顾 spring中的事务管理的api spring中编程式事务管理 spring中声明式事务管理 2.事务回顾 2.1 事务的概念 事务是指逻辑上的一组操作,要么全成功,要么全失败 ...

  5. dubbo官网和帮助文档

    dubbo官网和帮助文档 https://github.com/apache/incubator-dubbo 内含帮助文档: http://dubbo.apache.org/books/dubbo-d ...

  6. 使用 react-native-tab-navigator 创建 TabBar 组件

    1.首先安装好ReactNative的运行环境,安装组件依赖库 使用npm install react-native-tab-navigator --save安装所依赖的第三方库 2.导入 impor ...

  7. Warning: isMounted(...) is deprecated in plain JavaScript React classes.

    1.错误提示 警告:isMounted(…)在纯 react.js 类中被弃用. 2.原因解析 出现此错误提示的原因是源代码内有已被React舍弃的代码,但此并不影响程序运行. 在index.js 内 ...

  8. vuejs 表单验证插件 VeeValidate

    VeeValidate https://baianat.github.io/vee-validate/

  9. Nginx:HTTP过滤模块

    参考资料<深入理解Nginx> HTTP过滤模块也是一种HTTP模块,与普通HTTP处理模块不同在于: 1.一个请求仅由一个HTTP处理模块处理,而可以被任意个HTTP过滤模块处理 2.普 ...

  10. 【VBA】VBA编写的,将一列中相同的内容的行提取出来单独生成文件

    数据如上图所示,点击RUN后的运行结果如下: 得到该文件夹,文件夹内容如上图. 代码如下: Private Sub Command_OLIVER() Dim arr arr = Range(" ...