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

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

#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. centos 编译安装PHP5.4

    2013年12月29日 19:52:30 已经安装好Apache 2.4 php版本 5.4 ./configure --prefix=/usr/local/lamp/php --with-apxs2 ...

  2. swift的一些知识点(不断完善中)

    首先,隆重推荐文章http://www.infoq.com/cn/articles/swift-brain-gym-optional swift 烧脑体操!目前有4篇文章,说的都很好! 1. 应该充分 ...

  3. CSS----布局注意事项

    1.当div标签中含有子标签,如果div标签的大小是被div中的子标签撑起来的,那么可能布局(之后)可能就会出现问题(if 父级div中没有border,padding,inlinecontent,子 ...

  4. PyCharm 新建文件时默认添加作者时间等

    将内容添加到Python Script 右侧的文本框中: 路径: File → Setting → Editor → File and Code Templates → Python Script # ...

  5. DDD领域模型数据访问权限之权限(十二)

    实现权限的领域对象:BAS_Permission public partial class BAS_Permission:AggreateRoot { private IRepository<B ...

  6. 大数据统计分析平台之二、ElasticSearch 6.2.1的安装与使用

    # 下载文件cd /usr/local/software wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch ...

  7. 百度未授权使用地图API

    百度地图管理员的回复:这是KEY服务升级的问题, 给您造成的不便,非常抱歉.但我们昨日已修复,你可以再审核一番.若不可以,请提供一下您的系统ak,邮箱或qq发送至(wangwenhai@baidu.c ...

  8. kafka中生产者和消费者API

    使用idea实现相关API操作,先要再pom.xml重添加Kafka依赖: <dependency> <groupId>org.apache.kafka</groupId ...

  9. kms可用激活服务器地址|kms可用激活服务器分享

    kms可用激活服务器地址|kms可用激活服务器分享   kms可用激活服务器地址都有哪些呢?使用kms激活服务器激活windows和office是微软提供的激活方式之一.kms激活服务器普遍由个人或企 ...

  10. hdu-1754 I Hate It【线段树】(求区间最大值)

    <题目链接> I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...