简直难到没朋友。

双向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. 如何学习php之吐槽

    我也做了php一段时间了.从技术层面上解释吧.   深入学习任何的东西都要有个体系.   1 完整的学习整个体系结构.解决有什么的问题.   推荐看看这个.http://www.open-open.c ...

  2. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  3. Keepalived安装工具

    装keepalived前,要先检查主机上是否已经安装, ps -ef | grep keepalive 不检查的话.easy把前人装的东西覆盖掉,那么曾经弄的配置文件都没了比較麻烦. 下面都为root ...

  4. Eclipse + PyDev 无法导入模块

    下载后的包,在python IDLE 都可以导入这些模块,但是在Eclipse里面需要我们自己添加路径 需要导入的模块,在那个路径下,就在这里添加路径即可,其他的同理.

  5. Salt Stack 官方文档翻译 - 一个想做dba的sa - 博客频道 - CSDN.NET

    OSNIT_百度百科 Salt Stack 官方文档翻译 - 一个想做dba的sa - 博客频道 - CSDN.NET Salt Stack 官方文档翻译 分类: 自动运维 2013-04-02 11 ...

  6. ext4 delalloc相关

    ext4文件系统delayed allocation相关研究 最近在一个项目上测试录音时,发现有丢数据的现象.通过串口发现打出了很多overrun的log. overrun是驱动层给上层应用的一个通知 ...

  7. 基于JVM规范的并发编程解决方案

    在并发的世界里,选择合适的状态处理方法将对并发性和正确性起到决定性的影响.这方面可选的方法有:共享可变性.隔离可变性以及完全不可变性. 对于并发问题来说最好的解决方法是从根本上消灭它而不是花很多时间解 ...

  8. POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)

    Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...

  9. 积累的VC编程小技巧之滚动条

    1.设置滚动条的滚动大小 创建一个基于CScrollview的SDI Project(在第6步中选CScrollview) 若你已创建了,这步可以省略. 然后: 改为如 void CTestView: ...

  10. go iota

    package main import ( "fmt" ) const ( a = 'A' b c = iota d ) func main() { fmt.Println(a) ...