博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1379 八数码难题
阅读量:6480 次
发布时间:2019-06-23

本文共 2575 字,大约阅读时间需要 8 分钟。

1.先用dfs枚举9!的全排列,存到hash数组里(类似离散化),因为顺序枚举,就不需要排序了

2.朴素bfs,判重就用二分找hash;如果发现当前状态=要求状态,输出步数结束程序

上代码

#include
#include
#include
#include
#include
using namespace std;const long long MAXHASH=362885; long long hash[MAXHASH];bool hashbook[MAXHASH];long long hn=0;bool hinit_book[10];long long end=123804765;void hinit(long long step,long long val){ if(step>8){ hn++; hash[hn]=val; return; } for(int i=0;i<=8;i++){ if(hinit_book[i]==0){ hinit_book[i]=1; hinit(step+1,val*10+i); hinit_book[i]=0; } }}bool hashput(long long val){ int l=1,r=hn; for(;;){ if(l==r){ if(hashbook[l]==0){ hashbook[l]=1; return 1; }else{ return 0; } } int mid=(l+r)/2; if(val>hash[mid]){ l=mid+1; }else{ r=mid; } }}struct uct1{ long long data; long long pos; long long step;}que[3000000];long long mywap(long long data,long long pa,long long pb){ long long ans=data; long long df=data%(long long)pow(10,9-pb+1)-data%(long long)pow(10,9-pb); ans-=df; ans+=df/pow(10,9-pb)*pow(10,9-pa); df=data%(long long)pow(10,9-pa+1)-data%(long long)pow(10,9-pa); ans-=df; ans+=df/pow(10,9-pa)*pow(10,9-pb); return ans;}int head=0,tail=0;int main() { hinit(0,0); long long pig; cin>>pig; int bap=pig; if(pig==end){ cout<<0; return 0; } int pigpos; for(pigpos=9;bap>0;pigpos--){ if(bap%10==0){ break; } bap=bap/10; } if(bap==0){ pigpos=1; } head=0; tail=0; que[tail].data=pig; que[tail].pos=pigpos; que[tail].step=0; tail++; for(;head
=1&&que[head].pos<=3&&flag[3]==0){ tdata=mywap(que[head].data,que[head].pos,que[head].pos+3); tpos=que[head].pos+3; flag[3]++; }else if(que[head].pos>=4&&que[head].pos<=6&&flag[4]<2){ if(flag[4]==0){ tdata=mywap(que[head].data,que[head].pos,que[head].pos+3); tpos=que[head].pos+3; }else{ tdata=mywap(que[head].data,que[head].pos,que[head].pos-3); tpos=que[head].pos-3; } flag[4]++; }else if(que[head].pos>=7&&que[head].pos<=9&&flag[5]==0){ tdata=mywap(que[head].data,que[head].pos,que[head].pos-3); tpos=que[head].pos-3; flag[5]++; }else{ break; } if(tdata==end){ cout<
View Code

其实还可以用双向bfs优化,算hash数组可以用康托展开

但懒得写了(逃)

转载于:https://www.cnblogs.com/sun123zxy/p/luogu1379.html

你可能感兴趣的文章
Inno setup中定制安装路径
查看>>
要懂得对你的老板好一点!
查看>>
HDU5139:Formula(找规律+离线处理)
查看>>
visio如何让动态连接线的单箭头变成双箭头?
查看>>
poj 1273 Drainage Ditches 网络流最大流基础
查看>>
Bash: how to check if a process id (PID) exists
查看>>
Mirantis Fuel fundations
查看>>
启动Tomcat一闪而过——分析及解决过程
查看>>
Android intent action大全
查看>>
使用 Flash Builder 的 Apple iOS 开发过程
查看>>
RabbitMq_05_Topics
查看>>
redis.conf
查看>>
SCALA中的函数式编程
查看>>
Windows删除无效服务
查看>>
将List<int> 转换为用逗号连接为字符串
查看>>
C/C++中extern关键字详解
查看>>
Eclipse 最有用的快捷键
查看>>
K & DN 的前世今生(微软开源命名变革)
查看>>
--@angularJS--angular与BootStrap3的应用
查看>>
I2C驱动程序框架probe道路
查看>>