POJ 1184 聪明的打字员
简直难到没朋友。
双向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 聪明的打字员的更多相关文章
- (广搜)聪明的打字员 -- POJ --1184
链接: http://poj.org/problem?id=1184 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#probl ...
- poj1184 聪明的打字员(BFS剪枝)
http://poj.org/problem?id=1184 用字符串s存下数字,并把光标位置做一个字符加到s末尾,用map做标记状态是否出现过,然后bfs即可. 不剪枝是过不了的,考虑的两种交换操作 ...
- 聪明的打字员---poj1184(bfs)
题目链接:http://poj.org/problem?id=1184 分析:首先可以发现有6*10^6种状态,比较多,不过搜索的时候可以去除一些无用的状态, 可以发现一个点的值(2-5)如果想要改变 ...
- poj 1184 广搜进阶题
起初的想法果然就是一个6000000的状态的表示. 但是后面觉得还是太过于幼稚了. 可以看看网上的解释,其实就是先转换位置,然后再改变数字的大小. #include<iostream> # ...
- codevs 1733 聪明的打字员 (Bfs)
/* Bfs+Hash 跑的有点慢 但是codevs上时间限制10s 也ok */ #include<iostream> #include<cstdio> #include&l ...
- poj 1184
经典的宽搜题目,感觉最好的办法应该是双向广搜. 不过用简单的启发式搜索可以飘过. #include <iostream> #include <cstdio> #include ...
- poj练习题的方法
poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...
- poj很好很有层次感(转)
OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...
- POJ题目分类推荐 (很好很有层次感)
著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...
随机推荐
- DBA 应该要注意Linux 环境下的一些操作
DBA 对OS的依赖.一丁点儿也不亚于DB.对于Oracle DBA.尤为突出 DB和OS的感情也与日俱增.耦合度高的让人一度以为这两要劳燕双飞了 例如.Oracle里面. 而且.故障诊断以及 ...
- php数据库操作类
config.db.php <?php $db_config["hostname"] = "localhost"; //服务器地址 $db_config[ ...
- ABAP文件上传下载 用SMW0
以excel举例 smw0事物代码进入传输模板到服务器上: 下载模板的用到的from代码如下: FORM sub_chek_directory . DATA: l_formkey1 LIKE wwwd ...
- TEXT文本编辑框4 点击按钮读取文本框内容到内表
*&---------------------------------------------------------------------* *& Report ZTEST_CWB ...
- Python标准库:内置函数dict(iterable, **kwarg)
本函数是从可迭代对象来创建新字典.比方一个元组组成的列表,或者一个字典对象. 样例: #dict() #以键对方式构造字典 d1 = dict(one = 1, two = 2, a = 3) pri ...
- Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴)
在开发一些系统应用的时候,我们会用到Android的剪贴板功能,比如将文本文件.或者其他格式的内容复制到剪贴板或者从剪贴板获取数据等操作.Android平台中每个常规的应用运行在自己的进程空间中,相对 ...
- 应用程序初始化正常(0xc015002)失败解决方法
VS2005 sidebyside manifest error Microsoft.VC80.MFC Microsoft.VC80.CRT Microsoft.VC80.MFCLOC msvcr80 ...
- Photoshop图象切片保存为网页HTML(DIV+CSS布局)的方法
首先,制作图象切片(以一张图片为例子) 一.选择“切片”工具,在图像上拖动以分割图像(例如:一张图像切割2次就形成3个切片)切片后如下图 二.设置切片选项(如大小.目标链接.图片说明等等):选择“切片 ...
- osgEarth开发之OSG解构——失败的尝试
概述 本文在吸收了<最长的一帧>以及相关参考资料的基础之上解读OSG的基础数据结构,渲染方法. 实现 在这第一部分里,要理解的是run函数的实现,因为以下这一段证明了它的重要性和强大的能力 ...
- codeforces 659C Tanya and Toys
题目链接:http://codeforces.com/problemset/problem/659/C 题意: n是已经有的数字,m是可用的最大数字和 要求选自己没有的数字,且这些数字的数字和不能超过 ...