https://daniu.luogu.org/problem/show?pid=1379
省选的收获
暗金
学会了A*啦啦啦;
我在第一天学了A*;
然后回家颓废之余思考思考;
又问了van爷一些小问题;
然后就在fop_zz的 支持 嘲笑下AC了;
A*一开始感觉会很深奥;
然而就是一个剪枝而已;
呵呵呵;
这里又一个估价函数;
当前状态的估价函数是当前在状态理想情况下到达目标状态的代价;
比如我们现在走了g步;
估价为H步;
然后我们迭代加深枚举的k步(k从0开始枚举,所以我们要预先特判无解情况,当然可以掐秒);
如果g+H>k;
显然萎了;
就是这么简单;

至于为什么A*是dfs不是bfs;
因为bfs没有一个确定的k;
而dfs的k我们是枚举的;

至于这样的话有很多的重复;
因为假如答案是4;
那么k=0~3时的搜索是无用的;
但是在这道题目里面显然k不是很大;
而且加入k=ans爆搜的时间复杂度是n;
那么k=0~ans的时间复杂度类似与n*n;
虽然这样,还是比直接暴力好;
那我们可不可以把k-1的所有g==k,g==k-1的状态存下来呢;
好像很麻烦欸;
当然楼k我们可以二分;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Ll long long
using namespace std;
int fx[9]{0,1,1,1,2,3,3,3,2};
int fy[9]{0,1,2,3,3,3,2,1,1};
int xx[4]{1,-1,0,0};
int yy[4]{0,0,-1,1};
int a[4][4];
int n,m,x,y,z,X,Y,ans;
char c;
int h(){int ans=0;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)if(a[i][j])ans+=abs(i-fx[a[i][j]])+abs(j-fy[a[i][j]]);return ans;
}
void dfs(int tf,int X,int Y,int g){int H=h();if(!H){ans=g;return;}if(g==tf||ans||H+g>tf)return;for(int i=0;i<4;i++){int x=X+xx[i];int y=Y+yy[i];if(x&&y&&x<4&&y<4){swap(a[X][Y],a[x][y]);dfs(tf,x,y,g+1);swap(a[X][Y],a[x][y]);}}
}
int main()
{for(int i=1;i<=3;i++)for(int j=1;j<=3;j++){cin>>c; a[i][j]=c-48;if(!a[i][j])X=i,Y=j;}for(int tf=0;;tf++){dfs(tf,X,Y,0);  if(ans){printf("%d",ans);return 0;};}
}

至于为什么我枚举的变量是tf;
用来纪念我ZJOI2017的颓废;

转载于:https://www.cnblogs.com/largecube233/p/6797886.html

IDA*-洛谷P1379 八数码难题相关推荐

  1. 洛谷—P1379 八数码难题

    题目链接:P1379 八数码难题 题目大意: 要求最少步骤的移动方法,实现从初始布局到目标布局的转变. 解题思路: 这道题目要用到搜索中比较难的搜索方法-迭代加深的A*算法.所谓迭代加深就是每次限制搜 ...

  2. 洛谷P1379八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...

  3. [洛谷] P1379 八数码难题( 提高+/省选- )

    八数码 1.题目 2.分析 3.代码 1. bfs (+queue) + unordered_map 重点分析 2.双向bfs (适用于知道起始状态的情况) 思路分析 3.双向bfs优化 思路 4.总 ...

  4. 洛谷 1379 八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  5. P1379 八数码难题 题解(双向宽搜)

    博客园同步 原题链接 简要题意: 给定一个 3 × 3 3 \times 3 3×3 的矩阵,每次可以把空格旁边(四方向)的一个位置移到空格上.求到目标状态的最小步数. 前置知识: 单向宽搜的写法 O ...

  6. 【洛谷】P1379 八数码难题

    题目地址: https://www.luogu.com.cn/problem/P1379 题目描述: 在3×33×33×3的棋盘上,摆有八个棋子,每个棋子上标有111至888的某一数字.棋盘中留有一个 ...

  7. 洛谷OJ:P1379 八数码难题(双向搜索)

    思路:相信不少小伙伴上来就是暴力DFS,但是拿到题之后我们不妨想一想如果纯DFS爆搜下来会产生多少种状态,这样的方法是否是最优的? 这里选择使用一种称之为双向搜索的方法(通过知乎学到的,放出来shar ...

  8. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

  9. 【codevs1225】八数码难题,如何精确地搜索

    1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道 ...

最新文章

  1. 简单介绍自动化运维工具clip
  2. javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)
  3. windows phone 7 中文天气预报应用--来源http://www.cnblogs.com/liulunet/archive/2011/08/17/2141696.html...
  4. 恢复Linux系统权限
  5. 【转载】也有很多的例子飞鸽传书
  6. 数据库的四大特性以及事务的隔离级别
  7. 内存管理:Linux Memory Management:MMU、段、分页、PAE、Cache、TLB
  8. Android中你可能忽略的知识点(1)-分辨率那些事
  9. php $GLOBALS 超全局变量的理解
  10. Java 序列化漏洞多到修不完
  11. java经纬度转换小数_java经纬度格式转换
  12. [渝粤教育] 中央财经大学 保险学概论 参考 资料
  13. PS2022神经滤镜Neural Filters离线安装包(PS2022/PS2021)
  14. 携程线上测评测试题目,答案解析
  15. 俄罗斯 搜索引擎 邮箱创建
  16. ActiveMQ详解
  17. Premier Bob的算法模板库(II)
  18. C++怎样获取当前系统时间?
  19. 免费外贸Wordpress网站内容采集教程
  20. 图像预处理——matlab

热门文章

  1. 转:用nohup命令让Linux下程序永远在后台执行
  2. 将solr安装到tomcat里
  3. 3 汪博士解读pmp_备考两月,我顺利通过PMP考试
  4. windows密钥连接linux,windows使用密钥登录linux
  5. 运维基础(2)实用工具篇
  6. Kubernetes 网络概念及策略控制(叶磊)
  7. Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)
  8. java选择循环_java选择和循环结构
  9. elk面试题_【182期】SpringCloud常见面试题(2020最新版)
  10. python3字典升序排序_Python(32)常用指引:排序指南