简直难到没朋友。

双向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 9999991using 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;//lefts.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. CDQZ_Training 2012-05-24 聪明的打字员

    题目: http://cdqz.openjudge.cn/noip/1012/ 时间限制: 20000ms 内存限制: 128000kB 描述 阿兰是某机密部门的打字员,她现在接到一个任务:需要在一天 ...

  2. 【SJTUOJ笔记】P1125 Typist (NOI2001 聪明的打字员)

    https://acm.sjtu.edu.cn/OnlineJudge/problem/1125 注:本文中,用←→↑↓分别表示光标左移.光标右移.加.减,swap0和swap5分别表示与第一位交换. ...

  3. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  4. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  5. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

  6. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  7. NOI 题目 试题 目录 信奥 历年

    NOI  题目  试题 目录 信奥 历年 NOI  2018 题目  试题 目录 信奥 历年 第一试   2018年7月18日   08:00-13:00 1.归程  return 2.冒泡排序    ...

  8. python csv写入字典_python csv与字典操作

    # encoding: utf-8 import csv d1 = {'banana':3,'apple':4,'pear':1,'orange':2} d2 = {'banana':3,'orang ...

  9. 高级搜索题集(夏天的风分类)

    基础的搜索BFS和DFS,自己找题切吧... 高级搜索的题集就在下面,自己看着办吧... 努力爆搜,努力剪枝吧~~~ [Level 1] HDOJ-1429 胜利大逃亡(续)    迷宫问题,有钥匙和 ...

最新文章

  1. Windows 10预览版14316开启Bash命令支持
  2. python formatters 与字符串 小结 (python 2)
  3. 升级WordPress时提示”另一更新正在进行”
  4. React Native 0.50版本新功能简介
  5. AngularJS:SQL
  6. IDFA的值什么时候会发生改变
  7. Hibernate3 jar包的作用[转]
  8. v8声卡怎么录制唱歌_V8声卡坑爹?想买的看完再决定,买了的看如何调试声卡...
  9. mysql被除数为0不报错_MySQL:关系除法
  10. 版本控制工具--svn和git的使用(一) -----版本控制的好处以及分类
  11. DataSet 添加数据集、行、列、主键和外键等操作示例
  12. github 上 Fork 别人的项目后的常用的操作指南
  13. android 添加联系人地址,android – 如何向联系人添加新字段?
  14. 一文详解深度相机之TOF成像
  15. 搭建云上博客——阿里云实验室 学习笔记
  16. 海康威视相机 RTSP 传输延迟解决方案
  17. ps怎么将png做成gif_【AE教程】AE如何导出背景透明的图层到PS中做gif动图?
  18. 还在用PS?程序猿:给我200行Python代码分分钟给你批量换脸
  19. LORD MicroStrain 惯性传感系统
  20. 计算机革命的主角和英雄——十大超级老牌黑客

热门文章

  1. python中查看显卡状态
  2. Python魔法函数
  3. 蓝桥杯java 算法提高 摆花
  4. 2017光棍节新生训练赛
  5. 事务的传播行为和隔离级别[transaction behavior and isolated level]
  6. Python全栈之路Day13
  7. 【fjwc2015】世界树
  8. HelloX项目github协同开发指南
  9. Hibernate级联操作 注解
  10. [轉]c#简单调用DELPHI DLL封装窗体