poj1184 聪明的打字员(BFS剪枝)
http://poj.org/problem?id=1184
用字符串s存下数字,并把光标位置做一个字符加到s末尾,用map做标记状态是否出现过,然后bfs即可。
不剪枝是过不了的,考虑的两种交换操作都不涉及到2,3,4,5位置,所以这几个位置只能通过up,down来改变。
如果这几个位置是和目标状态是不一样的,那肯定是用up,down操作是最优的,而不会执行left,right操作。
所以这几个位置只有在和目标状态一样时做left,right操作。
#include <iostream>
#include <map>
#include <string>
#include <queue>
using namespace std;
struct point
{
int step;
string s;
};
string e;
map<string,int> my;
queue<point> q;
int BFS(point st)
{
point t,tt; string ss; int i;
while(!q.empty()) q.pop();
q.push(st); my[st.s]=1;
while(!q.empty())
{
t=q.front(); q.pop(); for(ss=t.s,i=0;i<6;i++)
if(ss[i]!=e[i]) break;
if(i==6) return t.step;
ss=t.s; swap(ss[0],ss[ss[6]-'0']);//Swap0:
if(!my.count(ss))
{
tt.s=ss; tt.step=t.step+1;
q.push(tt); my[ss]=1;
}
ss=t.s; swap(ss[5],ss[ss[6]-'0']); //Swap1
if(!my.count(ss))
{
tt.s=ss; tt.step=t.step+1;
q.push(tt); my[ss]=1;
}
ss=t.s; if(ss[ss[6]-'0']!='9'&&ss[ss[6]-'0']!=e[ss[6]-'0']) ss[ss[6]-'0']+=1; //Up:
if(!my.count(ss))
{
tt.s=ss; tt.step=t.step+1;
q.push(tt); my[ss]=1;
}
ss=t.s; if(ss[ss[6]-'0']!='0'&&ss[ss[6]-'0']!=e[ss[6]-'0']) ss[ss[6]-'0']-=1;//Down:
if(!my.count(ss))
{
tt.s=ss; tt.step=t.step+1;
q.push(tt); my[ss]=1;
}
ss=t.s;
if(ss[6]-'0'!=0)//left
{
if(ss[6]!='5') //1 2 3 4位置相同才能移动光标
{
if(ss[ss[6]-'0']==e[ss[6]-'0']) ss[6]-=1;
}
else ss[6]-=1;
}
if(!my.count(ss))
{
tt.s=ss; tt.step=t.step+1;
q.push(tt); my[ss]=1;
}
ss=t.s;
if(ss[6]-'0'!=5)//Right
{
if(ss[6]!='0') //1 2 3 4位置相同才能移动光标
{
if(ss[ss[6]-'0']==e[ss[6]-'0']) ss[6]+=1;
}
else ss[6]+=1;
}
if(!my.count(ss))
{
tt.s=ss; tt.step=t.step+1;
q.push(tt); my[ss]=1;
}
}
}
int main(int argc, char *argv[])
{
point st;
while(cin>>st.s>>e)
{
my.clear();
st.s+='0'; st.step=0;
cout<<BFS(st)<<endl;
}
return 0;
}
poj1184 聪明的打字员(BFS剪枝)的更多相关文章
- POJ 1184 聪明的打字员
简直难到没朋友. 双向bfs + 剪枝. 剪枝策略: 对于2--5位置上的数,仅仅有当光标在相应位置时通过swap ,up.down来改变.那么当当前位置没有达到目标状态时,left和right无意义 ...
- hdu_1253_胜利大逃亡(bfs+剪枝)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题意:三维BFS,不解释 题解:DFS+剪枝会超时,裸BFS会超时,BFS+剪枝才能AC,有点伤 ...
- HDU-1226 超级密码 (BFS+剪枝)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进 ...
- HDU6223 Infinite Fraction Path bfs+剪枝
Infinite Fraction Path 这个题第一次看见的时候,题意没搞懂就没做,这第二次也不会呀.. 题意:第i个城市到第(i*i+1)%n个城市,每个城市有个权值,从一个城市出发走N个城市, ...
- 聪明的打字员---poj1184(bfs)
题目链接:http://poj.org/problem?id=1184 分析:首先可以发现有6*10^6种状态,比较多,不过搜索的时候可以去除一些无用的状态, 可以发现一个点的值(2-5)如果想要改变 ...
- codevs 1733 聪明的打字员 (Bfs)
/* Bfs+Hash 跑的有点慢 但是codevs上时间限制10s 也ok */ #include<iostream> #include<cstdio> #include&l ...
- hdu 1253 胜利大逃亡 (三维简单bfs+剪枝)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU 5652 India and China Origins 二分优化+BFS剪枝
题目大意:给你一个地图0代表可以通过1代表不可以通过.只要能从第一行走到最后一行,那么中国与印度是可以联通的.现在给你q个点,每年风沙会按顺序侵蚀这个点,使改点不可通过.问几年后中国与印度不连通.若一 ...
- hdu-1253(bfs+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路:简单的bfs,就是要注意剪枝. #include<iostream> #inc ...
随机推荐
- 【Android】实现动态显示隐藏密码输入框的内容
在设置输入密码框时,有些时候需要按钮控制输入的是“明文”或者“暗文”. 这里提供一种Android实现动态显示隐藏密码输入框的内容的方法: 主要是通过设置EditText的setTransformat ...
- boost库在工作(39)网络UDP异步服务端之九
前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...
- C#枚举器接口IEnumerator的实现
原文(http://blog.csdn.net/phpxin123/article/details/7897226) 在C#中,如果一个类要使用foreach结构来实现迭代,就必须实现IEnumera ...
- jquery selector
jquery的选择器功能 1 :lt(index) selector 一组元素选择index之前的元素,若index<0 则倒着选过来 http://api.jquery.com/lt-sele ...
- hadoop下载
1.输入网址: http://mirrors.cnnic.cn/apache/hadoop/common/ 2.选择需要的版本进行点击下载
- CSS 设计彻底研究(三)深入理解盒子模型
第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...
- C++ Primer Chapter 1
When I start reviewing, I thought Chapter is useless. Because the title is "Getting Start" ...
- Eclipse控制台显示Tomcat日志
今天看一篇学习Struts的博文,文章里面提到从生成的日志,结果,怎么鼓捣都看不到.心情也跟着烦躁了.于是晚饭后出去散步,冷静一下,然后决定晚上一定搞掂这个问题.这不,搞掂了,写篇博文记录一下. St ...
- Python学习(三) 输出任意格式的字符串以及字符串的切片
在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...
- java类中的static成员变量和static方法简单介绍,持续补充
一.静态成员变量 1.属于整个类而不是某个对象实例,所以可以直接通过类名和对象名去调用. 2.静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收 二.静态方 ...