简直难到没朋友。

双向bfs + 剪枝。

剪枝策略:

对于2--5位置上的数,仅仅有当光标在相应位置时通过swap ,up。down来改变。那么当当前位置没有达到目标状态时,left和right无意义。

好了。仅仅剪掉这里就过掉了。。。

还有比較炫酷的方法实现枚举720种排列。

。。

然后状压什么的。。。

功力不够全然看不懂。

。。。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 9999991 using namespace std; short int mark[1000000][7][2]; struct Q
{
int ans,sta,site,fl;
}; int s[10]; int pre[] = {1000000,100000,10000,1000,100,10,1};
// 0 1 2 3 4 5 6
inline int Cal(int num,int site,int ch)
{
int temp = (num/pre[site])%10 + ch;
if(0 <= temp && temp <= 9)
return num/pre[site-1]*pre[site-1] + temp*pre[site] + num%pre[site];
return num;
} inline int Swap(int num,int site,int m)
{
int t1 = (num/pre[site])%10;
int t2 = (num/pre[m])%10; if(t1 == t2)
return num; num = num/pre[site-1]*pre[site-1] + t2*pre[site] + num%pre[site];
num = num/pre[m-1]*pre[m-1] + t1*pre[m] + num%pre[m];
return num;
} bool Judge(int site,int a,int b)
{
if((a/pre[site])%10 == (b/pre[site])%10)
return true;
return false;
} int bfs(int a,int b)
{
memset(mark,-1,sizeof(mark)); queue<Q> q;
Q s,t; s.sta = a;
s.fl = 0;
s.ans = 0;
s.site = 1; mark[s.sta][s.site][s.fl] = 0;
q.push(s); s.sta = b;
s.ans = 0;
s.fl = 1; for(int i = 1;i <= 6; ++i)
{
s.site = i;
mark[s.sta][s.site][s.fl] = 0;
q.push(s);
} while(q.empty() == false)
{
t = q.front();
q.pop(); // printf("site = %2d sta = %6d fl = %2d ans = %2d\n",t.site,t.sta,t.fl,t.ans); if(mark[t.sta][t.site][t.fl^1] != -1)
{
return mark[t.sta][t.site][t.fl^1] + t.ans;
} s.fl = t.fl;
s.ans = t.ans+1; //left
s.sta = t.sta; if(t.site > 1 && (t.site < 2 || t.site > 5 || Judge(t.site,t.sta,t.fl == 0 ? b : a)))
{
s.site = t.site-1;
if(mark[s.sta][s.site][s.fl] == -1)
{
mark[s.sta][s.site][s.fl] = s.ans;
q.push(s);
}
} //right
if(t.site < 6 && (t.site < 2 || t.site > 5 || Judge(t.site,t.sta,t.fl == 0 ? b : a)))
{
s.site = t.site+1;
if(mark[s.sta][s.site][s.fl] == -1)
{
mark[s.sta][s.site][s.fl] = s.ans;
q.push(s);
}
} //up
s.sta = Cal(t.sta,t.site,1);
s.site = t.site;
if(mark[s.sta][s.site][s.fl] == -1)
{
mark[s.sta][s.site][s.fl] = s.ans;
q.push(s);
} //down
s.sta = Cal(t.sta,t.site,-1); if(mark[s.sta][s.site][s.fl] == -1)
{
mark[s.sta][s.site][s.fl] = s.ans;
q.push(s);
} //swap0
if(t.site != 1)
{
s.sta = Swap(t.sta,t.site,1); if(mark[s.sta][s.site][s.fl] == -1)
{
mark[s.sta][s.site][s.fl] = s.ans;
q.push(s);
}
} //swap1
if(t.site != 6)
{
s.sta = Swap(t.sta,t.site,6);
if(mark[s.sta][s.site][s.fl] == -1)
{
mark[s.sta][s.site][s.fl] = s.ans;
q.push(s);
}
}
}
return 0;
} int main()
{
//freopen("data.txt","r",stdin);
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",bfs(a,b)); return 0;
}

POJ 1184 聪明的打字员的更多相关文章

  1. (广搜)聪明的打字员 -- POJ --1184

    链接: http://poj.org/problem?id=1184 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...

  2. poj1184 聪明的打字员(BFS剪枝)

    http://poj.org/problem?id=1184 用字符串s存下数字,并把光标位置做一个字符加到s末尾,用map做标记状态是否出现过,然后bfs即可. 不剪枝是过不了的,考虑的两种交换操作 ...

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

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

  4. poj 1184 广搜进阶题

    起初的想法果然就是一个6000000的状态的表示. 但是后面觉得还是太过于幼稚了. 可以看看网上的解释,其实就是先转换位置,然后再改变数字的大小. #include<iostream> # ...

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

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

  6. poj 1184

    经典的宽搜题目,感觉最好的办法应该是双向广搜. 不过用简单的启发式搜索可以飘过. #include <iostream> #include <cstdio> #include ...

  7. poj练习题的方法

    poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...

  8. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

  9. POJ题目分类推荐 (很好很有层次感)

    著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...

随机推荐

  1. 男性在下一100层【第三层】——高仿手机银行client接口

    前言: 从<男性在下一100层>系列博文[二楼]现在出版了整整三个月后,.从上述观点和这么多朋友的意见还是比较喜欢真实类的博文. 毕竟我们都叫"攻城狮".所以要看是否这 ...

  2. Mac Python路径总结

    Mac 下Python 可以多版本的并存,并且Python的目录也有好几个,不过总体来说,Mac 自带的有python 还是比较方便的 Mac 系统自带的又Python ,可能Python版本需要更新 ...

  3. Android SDK 环境变量配置(Windows)

    Android 开发需要进行adb的配置, 这里使用的是 adt-bundle-windows-x86_64-20140321, 里面捆绑的有 eclipse ,不需要再进行 其他的配置,直接下载解压 ...

  4. POI读取公式的值

    excel中的数据: package poi; import java.io.FileInputStream; import java.io.IOException; import java.io.I ...

  5. javascript属性一览

    getElementsByTagName() 方法可返回带有指定标签名的对象的集合. getElementsByName() 方法可返回带有指定名称的对象的集合. getAttribute() 方法返 ...

  6. vector中的find

    vector中的find - huangyimin的专栏 - 博客频道 - CSDN.NET vector中的find 2011-01-13 09:57 11334人阅读 评论(0) 收藏 举报 ve ...

  7. dialog开发

    dialog开发屏幕编程:ok_code在程序里用sy-ucomm接受 调用其他事物代码:call transaction ‘SE38’. 1:50 选择屏幕之屏幕按钮: selection-scre ...

  8. QT5静态编译教程,主要针对vs2012(渡世白玉)

    QT5,VS2012静态编译,所有的库准备充分的话qwebkit也可以静态编译通过,但是我编译的版本使用中如果用了QWEBVIEW控件在连接时会出错. 注:我自己编译的环境是:win server 2 ...

  9. Guava学习笔记:EventBus(转)

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现.对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和 ...

  10. Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例

    1,加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下: (1)实例化CMMotionManager类 (2)向CMMotionManager的accelerometerUpdateInte ...