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

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

#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. Android service与Thread

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  2. 使用Let's Encrypted HPPTS你的网站

    1.前言 最近,有同事咨询我,怎么样使用Let's Encrypted部署数字证书,于是,结合自己之前的实践,简单总结下. 2.HTTPS的优势 什么加密,防篡改,防广告植入什么的,这个就不多说了.这 ...

  3. Unicode范围预览

    链接: https://www.zhangxinxu.com/study/201611/show-character-by-charcode.php?range=4E00-9FBB 备注: Unico ...

  4. STM32应用实例五:与SHT1X温湿度传感器通讯

    在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10.SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列.包括一个电容性聚合体测湿敏感元件.一个用能隙材料制成 ...

  5. vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)

    模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const router = new VueRouter({ mode: 'history', // 两种类型hi ...

  6. jquery----语法扩展(导入js文件)

    简单使用 第一步,新建js文件 第二步,在js文件中添加 $.extend({ "GDP": function () { console.log("哈哈哈哈") ...

  7. DB操作-用批处理执行Sql语句

    用批处理在命令行状态下调用查询分析器来执行这个sql文件里的语句.下面就是sqlserver帮助里对于查询分析器(isqlw)命令行参数的解释:isqlw 实用工具(SQL 查询分析器)使您得以输入 ...

  8. PTA之求单链表结点的阶乘和

    本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int ...

  9. 使用gunicorn将django项目部署到生产环境的子目录下,在nginx后端获取客户真实IP地址

    生产环境有时,并不是为了一个项目而存在的.毕竟,域名是比较稀有的. 今天遇到这个问题,解决了.作个记录. 并且,如果将django项目部署在Nginx后面,那如何获取用户真实的IP地址呢? 下面就来解 ...

  10. Hibernate的核心对象关系映射

    Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...