HDU 1226 超级密码(数学 bfs)
传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=1226
超级密码
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4901 Accepted Submission(s): 1591
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
22 10
3
7 0 1
2 10
1
1
25 16
3
A B C
give me the bomb please
CCB
Hint
Huge input, scanf is recommended.
不要试图去枚举十进制n的倍数来然后看看给的几个数字能否凑出来,可以想象2要翻倍多少次才能达到500位的长度,
因此要从给定的数字入手,枚举数字的各种组合情况,判断是不是n的整数倍。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<memory.h>
using namespace std;
int n,c,m,book[],vis[];
int flag=;
struct node
{
int s[],len;
};
queue<node> q;
int mod(node t)
{
int temp=;
for(int i=;i<t.len;i++)
{
temp=(temp*c+t.s[i])%n;
}
return temp;
}
void pr(node a)
{
for(int i=;i<a.len;i++)
{
if(a.s[i]<=)
printf("%d",a.s[i]);
else
printf("%c",a.s[i]+'A'-);
}
printf("\n");
return ;
}
void bfs()
{
node t;
t.len=;
int v;
for(int i=;i<;i++)//先出来第一个结点,因为密码第一位不能为0
{
if(book[i]==)
{
t.s[]=i;
t.len=;
v=mod(t);
if(v==)
{
pr(t);
flag=;
return ;
}else
{
if(vis[v]==)
{
vis[v]=;
q.push(t);
}
}
}
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=;i<;i++)
{
if(book[i]==)
{
t.s[t.len]=i;
t.len++;
v=mod(t);
if(v==)
{
pr(t);
flag=;
return ;
}else
{
if(vis[v]==&&t.len<)//需要判断一下数位
{
vis[v]=;
q.push(t);
}
}
t.len--;
}
}
}
return ;
}
int main()
{
int T;
char s[];
cin>>T;
while(T--)
{
flag=;
memset(vis,,sizeof(vis));
memset(book,,sizeof(book));
while(!q.empty())
{
q.pop();
}
cin>>n>>c>>m;
getchar();
for(int i=;i<m;i++)
{
cin>>s;
if(s[]<=''&&s[]>='')
{
book[s[]-'']=;
}else
{
book[+s[]-'A']=;
}
}
if(n!=)
{
bfs();
if(flag==)
cout<<"give me the bomb please"<<endl;
}else//n==0的话,不能取模,因此不能入队,特判一下
{
if(book[])
cout<<""<<endl;
else
cout<<"give me the bomb please"<<endl;
}
}
}
而且这样的话还有一个强剪枝就是如果余数相同就没必要再次入队了,
因为无论是大数还是小数如果模n同余那么再添上其他数字的话再模n还是同余的,
这样每个余数最多在队列里出现一次,也就是说队列中最多出现5000个结点,大大优化了时间。
还有要注意的一点是n=0时的特判。
code:
HDU 1226 超级密码(数学 bfs)的更多相关文章
- hdu 1226 超级密码(bfs+余数判重)
题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上. 首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...
- hdu.1226.超级密码(bfs)
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdu 1226 超级密码
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem D ...
- HDU 1226 超级密码(BFS) (还需研究)
Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Desc ...
- HDU 1226 超级密码 (搜素)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1226 题意简单,本来是一道很简单的搜素题目. 但是有两个bug: 1.M个整数可能有重复的. 2.N可 ...
- HDOJ 1226 超级密码
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 超级密码 hdu1226 bfs
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDOJ 1226 超级密码(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. & ...
- HDU-1226 超级密码 (BFS+剪枝)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进 ...
随机推荐
- UI特效资料-----ShaderWeaver
主页:www.shaderweaver.com教程:www.shaderweaver.com/tutorials.html 1.一款插件,挺强大的 ShaderWeaver使用教程-基本操作介绍 ht ...
- Unity3D游戏轻量级xlua热修复框架
Unity3D游戏轻量级xlua热修复框架 一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua ...
- vim脚本语言
转自:http://man.chinaunix.net/newsoft/vi/doc/usr_41.html#usr_41.txt Vim 脚本语言在很多地方用到,包括 vimrc 文件, 语法文件, ...
- WCF入门教程通信(二)
一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...
- 深入理解JavaScript系列(25):设计模式之单例模式
介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工程师眼里,单例就是保证一个类只有一个 ...
- .net Ioc 之 Unity 适合刚开始使用
介绍: 首先稍微介绍一下,Unity是微软patterns& practices组用C#实现的轻量级.可扩展的依赖注入容器,可通过代码或xml配置文件来配置对象之间的关系.那么通过一个简单的代 ...
- MyEclipse 中tomcat 调试时进入未打断点的代码
在preferences里面取消挂起未捕获异常
- hello2详解
1.GreetingServlet.java(显示问候页面表单) 此servlet重写该doGet方法,实现GETHTTP方法.servlet显示一个简单的HTML问候表单,其提交按钮就像hello1 ...
- oracle OTT 学习
1.OTT概念 OTT 是 Object Type Translator 的缩写,对象类型转换器.它是用来将数据库中定义的类型(UDT)转换为C结构体类型的工具.借助OTT 可以用C语言调用OCI来访 ...
- Backbone事件机制核心源码(仅包含Events、Model模块)
一.应用场景 为了改善酷版139邮箱的代码结构,引入backbone的事件机制,按照MVC的分层思想搭建酷版云邮局的代码框架.力求在保持酷版轻量级的基础上提高代码的可维护性. 二.遗留问题 1.b ...