经典的宽搜题目,感觉最好的办法应该是双向广搜。

不过用简单的启发式搜索可以飘过。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int a,b;
char ans[1111111][7];
int inf[7]={1,1,10,100,1000,10000,100000};
struct D
{
int key;
char x,sum,now;
bool operator <(const struct D & xx) const
{
if(sum==xx.sum)
return now<xx.now;
return sum>xx.sum;
}
};
priority_queue <D> q; int cal(int key,int x,int b)
{
int from[7],to[7];
for(int i=1;i<=6;i++)
{
from[i]=key%10;
key/=10;
to[i]=b%10;
b/=10;
}
int ret=0;
for(int i=1;i<=6;i++)
if(i!=x)
{
ret+=from[i]!=to[i];
}
sort(from+1,from+1+6);
sort(to+1,to+1+6);
for(int i=1;i<=6;i++)
{
if(from[i]-to[i]>0)
ret+=from[i]-to[i];
else
ret+=to[i]-from[i];
}
return ret;
} int bfs(int a,int b)
{
memset(ans,100,sizeof(ans));
ans[a][1]=0;
struct D xx;
xx.key=a;
xx.sum=0+cal(a,1,b);
xx.x=1;
xx.now=0;
q.push(xx);
while(1)
{
int key=q.top().key;
int x=q.top().x;
int tmp=ans[key][x];
q.pop();
if(key==b)
return tmp;
if(x<6&&tmp+1<ans[key][x+1])
{
xx.now=ans[key][x+1]=tmp+1;
xx.key=key;
xx.x=x+1;
xx.sum=tmp+cal(key,x+1,b);
q.push(xx);
}
int txt=inf[6-x+1];
int keyx=key/txt%10;
if(keyx>0&&tmp+1<ans[key-1*txt][x])
{
xx.now=ans[key-1*txt][x]=tmp+1;
xx.key=key-1*txt;
xx.x=x;
xx.sum=tmp+cal(key-1*txt,x,b);
q.push(xx);
}
if(keyx<9&&tmp+1<ans[key+1*txt][x])
{
xx.now=ans[key+1*txt][x]=tmp+1;
xx.key=key+1*txt;
xx.x=x;
xx.sum=tmp+cal(key+1*txt,x,b);
q.push(xx);
}
int tt=key/inf[6];
int to=key%inf[6]+keyx*inf[6]-keyx*txt+tt*txt;
if(tmp+1<ans[to][x])
{
xx.now=ans[to][x]=tmp+1;
xx.key=to;
xx.x=x;
xx.sum=tmp+cal(to,x,b);
q.push(xx);
}
tt=key%10;
to=key/10*10+keyx-keyx*txt+tt*txt;
if(tmp+1<ans[to][x])
{
xx.now=ans[to][x]=tmp+1;
xx.key=to;
xx.x=x;
xx.sum=tmp+cal(to,x,b);
q.push(xx);
}
}
} int main()
{
// freopen("in.txt","r",stdin);
scanf("%d %d",&a,&b);
int ans=bfs(a,b);
cout<<ans<<endl;
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. poj 1184 广搜进阶题

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

  3. POJ 1184 聪明的打字员

    简直难到没朋友. 双向bfs + 剪枝. 剪枝策略: 对于2--5位置上的数,仅仅有当光标在相应位置时通过swap ,up.down来改变.那么当当前位置没有达到目标状态时,left和right无意义 ...

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

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

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

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

  6. poj 题目分类(1)

    poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  9. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

随机推荐

  1. S5PV210 LCD显示

    第一节 S5PV210 LCD控制器要使一块LCD正常显示文字或图像,不仅需要LCD驱动器,还需要相应的LCD控制器.LCD控制器的主要作用是将在系统存储器中的显示缓冲区中的LCD图像数据传送到外部L ...

  2. vue和echarts 封装的 v-charts 图表组件

    https://v-charts.js.org/#/ 在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出现正是为了解决这个痛点.基于 Vue2. ...

  3. vue系列之核心思想

    1.数据驱动 只要改变数据,Vuejs会通过Directives指令对DOM进行封装,当数据发生变化,会通知相应的DOM进行变化 Vuejs会对DOM进行监听,通过DOMListeners监听视图的变 ...

  4. 洛谷P4281 紧急会议

    传送门啦 思路: $ Lca $ 这个题要求这个显而易见吧.但是难就难在怎么在树上利用 $ Lca $ 去解决三个点的问题. 首先明确三个点两两的 三个 $ Lca $ 中有一对是相等的,我们也会发现 ...

  5. 【mongo】登陆报错

    今天登陆mongo时出现了错误 Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt fa ...

  6. bzoj 1112 poi 2008 砖块

    这滞胀题调了两天了... 好愚蠢的错误啊... 其实这道题思维比较简单,就是利用treap进行维护(有人说线段树好写,表示treap真心很模板) 就是枚举所有长度为k的区间,查出中位数,计算代价即可. ...

  7. python+selenium六:等待相关

    显式等待(sleep): 固定的等待(死等),不管页面有没有加载完,都等设置的时间过了再做下一步操作 隐式等待 全局生效,只写一次即可(仅当前页面),缺点:如果页面一直转圈,如:js出错将等待到所设置 ...

  8. python+selenium+unittest 实现自动化测试

    示例代码: baidu.py import csv #导入csv模块 from itertools import islice #从itertools导入islice,后边让其默认跳过第一行使用 fr ...

  9. 扩展方法 C#

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 定义和调用扩展方法 定义一个静态类以包含扩展方法. 该类必须对客户端代码可见. 有关可访问性规则 ...

  10. 【C++ Primer 第16章】1. 定义模板 (一)

    类模板 #include<iostream> #include<vector> #include<memory> using namespace std; temp ...