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的更多相关文章

  1. 近几年ACM/ICPC区域赛铜牌题

    2013 changsha zoj 3726 3728 3736 3735 2013 chengdu hud 4786 4788 4790 2013 hangzhou hdu 4770 4771 47 ...

  2. HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)

    HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...

  3. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 2015年ACM长春区域赛比赛感悟

    距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的. ...

  8. 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 ...

  9. hdu 5881 Tea (2016 acm 青岛网络赛)

    原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5881 Tea Time Limit: 3000/1000 MS (Java/Others)    Me ...

随机推荐

  1. 不需要用任何辅助工具打包Qt应用程序

    不需要用任何辅助工具打包Qt应用程序.方法如下:    生成release文件后,双击里面的exe文件,会弹出一个对话框,里面提示缺少哪一个DLL文件, 然后根据该文件名到你安装QT软件的目录下的/b ...

  2. 46 Simple Python Exercises-Higher order functions and list comprehensions

    26. Using the higher order function reduce(), write a function max_in_list() that takes a list of nu ...

  3. c++ cpp和hpp

    首先,我们可以将所有东西都放在一个.cpp文件内,编译器会将这个.cpp编译成.obj,即编译单元.一个程序可以由一个编译单元组成,也可以由多个编译单元组成.一个.cpp对应一个.obj,然后将所有的 ...

  4. const函数的使用

    const知道吗?解释其作用. 1.const 修饰类的成员变量,表示成员常量,不能被修改. 2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数. 3. ...

  5. JavaEE-01 JSP动态网页基础

    学习要点 B/S架构的基本概念 Web项目的创建和运行 JSP页面元素 MyEclipse创建和运行Web项目 Web程序调试 Web简史 web前端技术演进三阶段 WEB 1.0:信息广播. WEB ...

  6. 下载GitHub上的dnSpy源码

    一.方法 下载GitHub上项目的方法,目前我知道的有四种: 1.用svn软件checkout下载 2.安装git,然后git命令下载 3.直接下载项目压缩包 4.安装GitHub的客户端,然后下载项 ...

  7. 小程序之Button组件,函数的调用与简单的逻辑

    我们要实现一个简单的功能,在界面上放置一张图片,设置重新加载按钮,能更新图片. WXML代码: <!--index.wxml--> <view clas="index&qu ...

  8. 用python代码玩微信

    # 安装包 pip install -U wxpy from wxpy import * import time import json bot=Bot() my_friend = bot.frien ...

  9. Python之阻塞IO模型与非阻塞IO模型

    Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...

  10. SSM调用数据库存储过程

    ServiceImpl中: Map<String,Object> map=new HashMap<String,Object>(); map.put("bid&quo ...