2016 ACM/ICPC 区域赛(北京) E 题 bfs
https://vjudge.net/problem/UVALive-7672
题意 输入一个五位数n 问由12345变到n的操作最少次数 不可达输出-1
有三种操作
1.交换相邻的位置 次数不限制
2.使某一位上的数字+1 最多使用三次 (mod 10)
3.使某一位上的数字*2 最多使用两次 (mod 10)
解析 很容易想到预处理,然后O(1) 查询,操作次数最少,所以就bfs,一层一层向外拓展。
需要注意的是 一个数被访问过还可以再被访问(进队列),因为得到一个数可以有不同的操作方案,我们都需要将它向下进行扩展
比如说 26345
可 以 12345->22345(1+1)->23345->26345 (两次2操作,一次3操作)
还可以 12345->22345(1 * 2)->23345->26345 (一次2操作,两次3操作)
两个状态都要进队列才能满足答案正确性。然后开个三维数组记录vis[26345][2][1]标记这个状态访问过了。
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int ans[][];
int vis[][][]; //0 swap,1 +,2 double
struct node
{
string s;
int a,b,c;
};
int change(string s)//string 转int
{
int x=,ans=;
for(int i=s.length()-;i>=;i--)
{
ans+=(int)(s[i]-'')*x;
x*=;
}
return ans;
}
void bfs()
{
memset(ans,inf,sizeof(ans));
memset(vis,,sizeof(vis));
queue<node>q;
string beg="";
q.push({beg,,,});
ans[change(beg)][]=;
while(!q.empty())
{
node e=q.front();
string now=e.s;q.pop();
int noww=change(now);
if(e.b<)
{
for(int i=;i<;i++)
{
string t=now;
if(t[i]=='') t[i]='';
else t[i]++;
int temp=change(t);
if(!vis[temp][e.b+][e.c])
{
vis[temp][e.b+][e.c]=;
ans[temp][]=min(ans[temp][],e.a+e.b+e.c+);
q.push({t,e.a,e.b+,e.c});
}
}
}
if(e.c<)
{
for(int i=;i<;i++)
{
string t=now;
int k=t[i]-'';
k+=k,k%=;
t[i]=''+k;
int temp=change(t);
if(!vis[temp][e.b][e.c+])
{
vis[temp][e.b][e.c+]=;
ans[temp][]=min(ans[temp][],e.a+e.b+e.c+);
q.push({t,e.a,e.b,e.c+});
}
}
}
for(int i=;i<;i++)
{
string t=now;
swap(t[i],t[i+]);
int temp=change(t);
if(ans[temp][]==inf)
{
ans[temp][]=min(ans[temp][],e.a+e.b+e.c+);
q.push({t,e.a+,e.b,e.c});
}
}
}
}
int main()
{
bfs();
string s;
while(cin>>s)
{
int x=change(s);
if(ans[x][]==inf)
cout<<-<<endl;
else
cout<<ans[x][]<<endl;
}
}
2016 ACM/ICPC 区域赛(北京) E 题 bfs的更多相关文章
- 近几年ACM/ICPC区域赛铜牌题
2013 changsha zoj 3726 3728 3736 3735 2013 chengdu hud 4786 4788 4790 2013 hangzhou hdu 4770 4771 47 ...
- HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online(2016ACM青岛网络赛部分题解)
2016 ACM/ICPC Asia Regional Qingdao Online(部分题解) 5878---I Count Two Three http://acm.hdu.edu.cn/show ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)
Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 2015年ACM长春区域赛比赛感悟
距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的. ...
- hdu 5868 2016 ACM/ICPC Asia Regional Dalian Online 1001 (burnside引理 polya定理)
Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K ...
- hdu 5881 Tea (2016 acm 青岛网络赛)
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5881 Tea Time Limit: 3000/1000 MS (Java/Others) Me ...
随机推荐
- RxJava的map方法与flatMap方法
简单讲,map和flatMap都是来完成Observable构造的数据到Observer接收数据的一个转换,这么说有点绕
- Dockerfile 中的 CMD和ENTRYPOINT 两兄弟
CMD 先说老大 CMD 当一个容器准备好运行之后,需要找一个指定命令来创建一个初始进程并运行. 一,/bin/sh -c 因为某种意义上一个Dockerfile其实可以理解是一个简化版bash 脚本 ...
- 如何修改开发板主频--迅为iMX6UL开发板
平台:iMX6UL开发板 iMX6UL开发板 可以在文件系统中通过命令修改 CPU 运行的主频.如下图所示,使用命令“cat /sys/devices/system/cpu/cpu ...
- python的特殊数字类型(无穷大、无穷小等)
float('inf') 表示正无穷 -float('inf') 或 float('-inf') 表示负无穷 其中,inf 均可以写成 Inf 起步python中整型不用担心溢出,因为python理论 ...
- html自己写响应式布局(说起来很高大上的样子,但是其实很简单)
第一步,打开电脑中安装的Sublime Text3,新建demo文件夹用来存放文件,在里面新建一个HTML文件,通过Tab快捷键迅速创建一个HTML模板,并命名标题. 第二步,在Body标签里添加三个 ...
- faster rcnn的改进方向
http://blog.csdn.net/linolzhang/article/details/74159463 http://blog.csdn.net/linolzhang/article/det ...
- java登录拦截Filter
此例子为一个简单的登录拦截. 首先在web.xml中配置拦截类. <filter-mapping> <filter-name>SessionFilter</filter- ...
- JDK的4种引用类型
在java中,大致有以下几种引用类型,强引用(StrongReference).软引用(SoftReference).弱引用(WeakReference).虚引用(PhantomReference) ...
- LeetCode(100) Same Tree
题目 Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...
- No unique bean of type..... Unsatisfied dependency of type
比如在XXXServiceImpl里面写了aa()方法给别的地方调用 但是自己又调用了自己 在开头写了 @Autowired Private XXX xxx; xxx.aa(); 这样重复调用自己的b ...