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

  1. POJ 1184 聪明的打字员

    简直难到没朋友. 双向bfs + 剪枝. 剪枝策略: 对于2--5位置上的数,仅仅有当光标在相应位置时通过swap ,up.down来改变.那么当当前位置没有达到目标状态时,left和right无意义 ...

  2. hdu_1253_胜利大逃亡(bfs+剪枝)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题意:三维BFS,不解释 题解:DFS+剪枝会超时,裸BFS会超时,BFS+剪枝才能AC,有点伤 ...

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

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

  4. HDU6223 Infinite Fraction Path bfs+剪枝

    Infinite Fraction Path 这个题第一次看见的时候,题意没搞懂就没做,这第二次也不会呀.. 题意:第i个城市到第(i*i+1)%n个城市,每个城市有个权值,从一个城市出发走N个城市, ...

  5. 聪明的打字员---poj1184(bfs)

    题目链接:http://poj.org/problem?id=1184 分析:首先可以发现有6*10^6种状态,比较多,不过搜索的时候可以去除一些无用的状态, 可以发现一个点的值(2-5)如果想要改变 ...

  6. codevs 1733 聪明的打字员 (Bfs)

    /* Bfs+Hash 跑的有点慢 但是codevs上时间限制10s 也ok */ #include<iostream> #include<cstdio> #include&l ...

  7. hdu 1253 胜利大逃亡 (三维简单bfs+剪枝)

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. HDU 5652 India and China Origins 二分优化+BFS剪枝

    题目大意:给你一个地图0代表可以通过1代表不可以通过.只要能从第一行走到最后一行,那么中国与印度是可以联通的.现在给你q个点,每年风沙会按顺序侵蚀这个点,使改点不可通过.问几年后中国与印度不连通.若一 ...

  9. hdu-1253(bfs+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路:简单的bfs,就是要注意剪枝. #include<iostream> #inc ...

随机推荐

  1. 【Android】实现动态显示隐藏密码输入框的内容

    在设置输入密码框时,有些时候需要按钮控制输入的是“明文”或者“暗文”. 这里提供一种Android实现动态显示隐藏密码输入框的内容的方法: 主要是通过设置EditText的setTransformat ...

  2. boost库在工作(39)网络UDP异步服务端之九

    前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...

  3. C#枚举器接口IEnumerator的实现

    原文(http://blog.csdn.net/phpxin123/article/details/7897226) 在C#中,如果一个类要使用foreach结构来实现迭代,就必须实现IEnumera ...

  4. jquery selector

    jquery的选择器功能 1 :lt(index) selector 一组元素选择index之前的元素,若index<0 则倒着选过来 http://api.jquery.com/lt-sele ...

  5. hadoop下载

    1.输入网址: http://mirrors.cnnic.cn/apache/hadoop/common/ 2.选择需要的版本进行点击下载

  6. CSS 设计彻底研究(三)深入理解盒子模型

    第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...

  7. C++ Primer Chapter 1

    When I start reviewing, I thought Chapter is useless. Because the title is "Getting Start" ...

  8. Eclipse控制台显示Tomcat日志

    今天看一篇学习Struts的博文,文章里面提到从生成的日志,结果,怎么鼓捣都看不到.心情也跟着烦躁了.于是晚饭后出去散步,冷静一下,然后决定晚上一定搞掂这个问题.这不,搞掂了,写篇博文记录一下. St ...

  9. Python学习(三) 输出任意格式的字符串以及字符串的切片

    在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...

  10. java类中的static成员变量和static方法简单介绍,持续补充

    一.静态成员变量 1.属于整个类而不是某个对象实例,所以可以直接通过类名和对象名去调用. 2.静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收 二.静态方 ...