题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1226/

题目大意是:寻找一个五百位之内的C进制密码,该密码是N的正整数倍,而且只能用给定的数构成密码,求这样的密码最小是多少。思路也不难想到,密码的位数有限,我们可以通过广度优先搜索来搜索目标状态,通过已经拼接好的密码再在最后添加一位就能产生扩展后的密码,也就是层数增加一层,我们可以一层层搜索,但是五百层是绝对不可能通过不剪枝的方法就能搜完的。剪枝的条件是:对于余数相同的数,只让最小的数入队。

证明如下:

假设a=k1*n+q(0<=q<n),b=k2*n+q(0<=q<n),而且 k2>k1,(即a,b余数相同但是a大)那么再进行扩展时,t*a+c=(t*k1)*n+t*q+c,t*b=(t*k2)*n+t*q+c,此时必有t*a>t*b,而且两者模n的余数一定是相等的,如果余数都是0,那么显然t*b+c更加小,所以对于每一种余数,我们只要保存最小数的进行扩展就能保证最终第一个出现的N倍数的数是最小的密码。若选择较大的数成功搜索,则比它小的余数相同的数按照同样的步骤肯定能成为N的倍数。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
#define maxn 510
#define maxm 5010
int n,m,t,c;
int book[];
bool vis[maxm];
struct node{
int a[maxn];
int len;//分别保存每一位密码,密码长度
};
int getmod(node tmp)//获取余数的函数
{
int ans=;
f(i,,tmp.len-)
{
ans=(ans*c+tmp.a[i])%n;
//应用多项式的计算,由于加法和乘法对于模运算的顺序是不影响的
}
return ans;
}
node cur,ans;
bool flag=false;
void print(node tmp)
{
f(i,,tmp.len-)
{
if(tmp.a[i]<)pf("%d",tmp.a[i]);
else pf("%c",tmp.a[i]-+'A');
}
putchar('\n');
} void bfs()
{
queue<node>q;
node st;
st.len=;
int r;
f(i,,)//首位特判,因为不能为零
{
if(book[i])
{
st.len=;
st.a[]=i;
r=getmod(st);
if(!r)
{
flag=;
ans=st;
return;
}
if(!vis[r])
{
q.push(st);
vis[r]=;
}
}
}
while(!q.empty())
{
cur=q.front();
q.pop();
f(i,,)
{
if(book[i])
{
cur.len++;
cur.a[cur.len-]=i;
r=getmod(cur);
if(!r)
{
flag=;
ans=cur;
return;
}
if(!vis[r]&&cur.len<)
{
vis[r]=;
q.push(cur);
}
cur.len--;
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
scan(t);
while(t--)
{
mem(book,);
mem(vis,false);
flag=false;
scan(n);scan(c);
scan(m);
getchar();
char x[];
while(m--)
{
scanf("%s",x);
if(x[]>=''&&x[]<='')book[x[]-'']=;//保存可访问的数
else book[x[]-'A'+]=;
}
if(n==)
{
if(book[])//如果要求密码是0的倍数,那么密码就是0,要是给了0就完成,没给0不可以达成目的
pf("0\n");
else pf("give me the bomb please\n");
}
else
{
bfs();
if(flag)
{
print(ans);
}
else pf("give me the bomb please\n");
}
}
return ;
}

hdu1226超级密码 bfs的更多相关文章

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

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

  2. HDU1226:超级密码(BFS)

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

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

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

  4. 超级密码(bfs)

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

  5. hdu_1226超级密码(BFS)

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

  6. HDU-1226 超级密码 (BFS+剪枝)

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

  7. HDOJ 1226 超级密码(bfs)

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

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

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

  9. 超级密码 hdu1226 bfs

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

随机推荐

  1. Springboot整合Dubbo和Zookeeper

    Dubbo是一款由阿里巴巴开发的远程服务调用框架(RPC),其可以透明化的调用远程服务,就像调用本地服务一样简单.截至目前,Dubbo发布了基于Spring Boot构建的版本,版本号为0.2.0,这 ...

  2. Mysql简单总结

    基于Mac OS X系统 MySQL的安装和配置 首先进入 MySQL 官网,选择免费的Community版:MySQL Community Server.MySQL 官网提供了tar.gz和dmg两 ...

  3. Gre 隧道与 Keepalived

    这一篇文章是做了不少功课的. 什么是 Gre 隧道 什么是 Vrrp KeepAlived 是什么 用Keepalived 怎么玩 附录 什么是 Gre 隧道 GRE 隧道是一种 IP-2-IP 的隧 ...

  4. FPGA小白学习之路(2)error:buffers of the same direction cannot be placed in series

    锁相环PLL默认输入前端有个IBUFG单元,在输出端有个BUFG单元,而两个BUFG(IBUFG)不能相连,所以会报这样的错: ERROR:NgdBuild:770 - IBUFG 'u_pll0/c ...

  5. NS域名工作原理及解析

    DNS域名工作原理及解析   0x00 定义 DNS( Domain Name System)是“域名系统”的英文缩写,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.D ...

  6. 如何优雅地删除 Linux 中的垃圾文件

    不知道大家是否也跟我一样,是一只要把的自己电脑文件安排的条理有序,把没用的文件会及时删掉的程序猿呢?如果是的话,那么我们可以愉快地探讨下文章的内容.如果不是的话,你也可以留下来凑凑热闹嘛(>-& ...

  7. Java 在PDF中添加表格

    本文将介绍通过Java编程在PDF文档中添加表格的方法.添加表格时,可设置表格边框.单元格对齐方式.单元格背景色.单元格合并.插入图片.设置行高.列宽.字体.字号等. 使用工具:Free Spire. ...

  8. centos安装图形界面通常有两种方式

    centos安装图形界面通常有两种方式   1.通过系统安装,在配置选择软件界面,选择GNOME桌面模式.

  9. Keras深度神经网络算法模型构建【输入层、卷积层、池化层】

    一.输入层 1.用途 构建深度神经网络输入层,确定输入数据的类型和样式. 2.应用代码 input_data = Input(name='the_input', shape=(1600, 200, 1 ...

  10. Python爬虫 抓肺炎疫情实时数据

    数据下载 网上一搜,首先搜到的是腾讯的疫情实时追踪,那就用这个数据源吧. 有了网址怎么抓数据呢?这里,可以从纷乱中找到最靠谱的下载方式.我习惯用FireFox浏览器,下面的讲解就以FireFox为例( ...