hdu1226超级密码 bfs
题目链接: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的更多相关文章
- hdu1226 超级密码 (BFS,里面用了大数取余原理)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...
- HDU1226:超级密码(BFS)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...
- hdu.1226.超级密码(bfs)
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 超级密码(bfs)
超级密码 Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu_1226超级密码(BFS)
超级密码 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密码是 ...
- HDU-1226 超级密码 (BFS+剪枝)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进 ...
- HDOJ 1226 超级密码(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. & ...
- HDU 1226 超级密码(BFS) (还需研究)
Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Desc ...
- 超级密码 hdu1226 bfs
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
随机推荐
- golang实现chunk方式的查询
有一个需求,是把表里面所有的数据都查询出来,并且生成json文件.因为一张表里面的数据很多,所以不可能一次性全部查询出来,所以需要用到chunk.之前用的gorm,但是发现gorm没有chunk方式的 ...
- Git 常用资源
库管理 克隆库 git clone https://github.com/php/php-src.git git clone --depth=1 https://github.com/php/php- ...
- IT知识圈视频学习资源整理贴
原文地址 热门课程 1.2019 尚学堂大数据全套视频教程(视频.源码.课件) 2.IDEA破解补丁(支持最新2019.2) 3.2019年 MySQL DBA 6期视频教程 4.微信小程序实战开发特 ...
- [红日安全]Web安全Day3 - CSRF实战攻防
本文由红日安全成员: Once 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字 ...
- 线程sleep,wait,notify,join,yield方法解析
线程的五种状态 线程从创建到销毁一般分为五种状态,如下图: 1) 新建 当用new关键字创建一个线程时,就是新建状态. 2) 就绪 调用了 start 方法之后,线程就进入了就绪阶段.此时,线程不会立 ...
- spring jpa ManyToMany 理解和使用
1.java和jpa 中所有的关系都是单向的.这个关系数据库不同,关系数据库,通过外键定义并查询,使得反向查询总是存在的. 2.JPA还定义了一个OneToMany关系,它与ManyToMany关系类 ...
- 时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...
- Asp.Net Core Endpoint 终结点路由之中间件应用
一.概述 这篇文章主要分享Endpoint 终结点路由的中间件的应用场景及实践案例,不讲述其工作原理,如果需要了解工作原理的同学, 可以点击查看以下两篇解读文章: Asp.Net Core EndPo ...
- LeetCode 33,在不满足二分的数组内使用二分的方法
本文始发于个人公众号:TechFlow,原创不易,求个关注 链接 Search in Rotated Sorted Array 难度 Medium 描述 给定一个升序排列的数组,它被分成两部分之后交换 ...
- Vuex的理解以及它的辅助函数
理解:vue中的“单向数据流”,这里借用官网的图示: Vue是单向数据流,v-model只是语法糖而已.单向数据流就是:数据总是[向下传递]从父级组件传递给子组件,只能单向绑定.子组件内部不能直接修改 ...