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. (转)Tomcat 7 访问 Manager 和 Host Manager

    配置好 Tomcat 7.0 后,在 tomcat-users.xml 中配置用户角色来访问 localhost:8080 的这样三个按钮总出现问题: Server Status Manager Ap ...

  2. 机器学习实战笔记5(logistic回归)

    1:简单概念描写叙述 如果如今有一些数据点,我们用一条直线对这些点进行拟合(改线称为最佳拟合直线),这个拟合过程就称为回归.训练分类器就是为了寻找最佳拟合參数,使用的是最优化算法. 基于sigmoid ...

  3. linux下安装swftools工具

    swfTools是一种实用工具与Adobe Flash文件(swf文件)工作的集合.可以把(pdf/gif/png/jpeg/jpg/font/wav) 7种格式转换为swf文件.一般常用于文件在线浏 ...

  4. WEB服务器5--IIS中ISAPI扩展、ISAPI筛选器

    在IIS的文档中经常会提到两个术语:ISAPI扩展和ISAPI筛选器. ISAPI扩展 “ISAPI扩展(ISAPI Extension)”是一种可以添加到IIS中以增强Web服务器功能的程序,其载体 ...

  5. WEB服务器2--IIS架构(转)

    开始之前可以先读:http://www.cnblogs.com/tiantianle/p/5419445.html 原文:http://www.cnblogs.com/arbin98/archive/ ...

  6. Asp.net开发常用的51个非常实用的代码

    1.弹出对话框.点击转向指定页面 Code: Response.Write("<script>window.alert('该会员没有提交申请,请重新提交!')</scrip ...

  7. C#邮件发送

    public static void CreateCopyMessage() { MailAddress from = new MailAddress("yang@163.com" ...

  8. React-Native OpenGL体验二

                                  搞了一下午,终于做了几个Demo出来,下面我就说一下我对React-Native下的OpenGL的流畅度的体验吧. 我使用的测试机是坚果手机 ...

  9. linux命令--virtualenv

    virtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持环境的干净,解决包冲突问题. 一.安装virtualenv virtualenv实际上是一个pyth ...

  10. H面试程序(1)编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的 下一秒

    编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒. 如输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005年 1 月 1 日 0 时 0 分 0 秒. ...