八数码(IDA*算法)
IDA*就是迭代加深和A*估价的结合
在迭代加深的过程中,用估计函数剪枝优化
并以比较优秀的顺序进行扩展,保证最早搜到最优解
需要空间比较小,有时跑得比A*还要快
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int num,cnt,x,y;
int zx[]={,-,,,},zy[]={,,-,,};//1上,2左,3下,4右
int c[][];
inline void read()
{
char cc;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
cc=getchar();
c[i][j]=cc-'';
if(c[i][j]==){
x=i;
y=j;
}
}
}
int de[][]={{,},{,},{,},{,},{,},{,},{,},{,},{,}}; //de[i][0/1]表示数字i在目标状态的横、纵坐标
inline int close() //笛卡尔距离之和
{
int mark=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
mark+=abs(i-de[c[i][j]][])+abs(j-de[c[i][j]][]);
return mark>>;
}
inline void dfs(int t,int pre)
{
// cout<<t<<endl;
// for(int i=1;i<=3;i++)
// {
// for(int j=1;j<=3;j++)
// printf("%d ",c[i][j]);
// puts("");
// }
// puts("");
int clo=close();
if(clo==){
printf("%d\n",t);
exit();
}
if(t+clo>cnt) return;
for(register int i=;i<=;i++)
if(((i+)%+)!=pre) //若i与pre不互逆 ,便扩展
{
x+=zx[i];y+=zy[i];
if(<=x&&x<=&&<=y&&y<=)
{
swap(c[x][y],c[x-zx[i]][y-zy[i]]);
dfs(t+,i);
swap(c[x][y],c[x-zx[i]][y-zy[i]]);
}
x-=zx[i];y-=zy[i];
}
}
int main()
{
read();
for(cnt=;cnt<=;cnt++)
dfs(,);
return ;
}
// 加上 register 160ms
// 不加 register 108ms
// 开O2 40ms
八数码(IDA*算法)的更多相关文章
- HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...
- HDU-1043 Eight八数码 搜索问题(bfs+hash 打表 IDA* 等)
题目链接 https://vjudge.net/problem/HDU-1043 经典的八数码问题,学过算法的老哥都会拿它练搜索 题意: 给出每行一组的数据,每组数据代表3*3的八数码表,要求程序复原 ...
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...
- A*算法解决八数码问题 Java语言实现
0X00 定义 首先要明确一下什么是A*算法和八数码问题? A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法也是一种启发性的算法,也是解决许多搜索问题的有效算法.算法中的距离估 ...
- HDU 1043 Eight 八数码问题 A*算法(经典问题)
HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...
- Java实现 蓝桥杯 算法提高 八数码(BFS)
试题 算法提高 八数码 问题描述 RXY八数码 输入格式 输入两个33表格 第一个为目标表格 第二个为检索表格 输出格式 输出步数 样例输入 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 ...
- 八数码难题之 A* 算法
人生第一个A*算法-好激动-- 八数码难题--又称八数码水题,首先要理解一些东西: 1.状态可以转化成整数,比如状态: 1 2 3 4 5 6 7 8 0 可以转化成:123456780这个整数 2. ...
- 【C++算法设计】八数码问题
八数码问题 [题意] 编好为1~8的8个正方形滑块摆成3行3列(一个格子为空),如图所示 每次可以移动空格相邻的滑块到空格,要计算出能移动出目标局面的最小步数,如无法达到则输出-1. [分析] 我们可 ...
- 【算法】BFS+哈希解决八数码问题
15拼图已经有超过100年; 即使你不叫这个名字知道的话,你已经看到了.它被构造成具有15滑动砖,每一个从1到15上,并且所有包装成4乘4帧与一个瓦块丢失.让我们把丢失的瓷砖“X”; 拼图的目的是安排 ...
随机推荐
- 常用Redis命令
在 Windows 下配置 Redis 集群 在 Windows 下配置多个 Redis(简化配置) MicrosoftArchive/redis 官方Redis集群搭建文档 Redis命令 Cent ...
- 使用awstat分析Nginx的访问日志
在我的上一篇文章<使用 Nginx 提升网站访问速度>中介绍了 Nginx 这个 HTTP 服务器以及如何通过它来加速网站的访问速度.在实际的网站运营中,我们经常需要了解到网站的访问情况, ...
- TerraBuilder创建地形之去除影像黑边,填充影像
最近在Skyline项目中使用TerraBuilder创建地形,由于地形比较大,分块下载卫星影像,然后再TerraBuilder中合并,由于合并.图形等等问题,导致创建处理出来的地形中存在严重的缝隙和 ...
- C#自定义控件 在 Toolbox显示不了的问题
1) Close your solution2) Tools->Options->"Windows Form Designer" - find AutoToolboxP ...
- java输出九九乘法口诀表
使用双重for循环输出九九乘法口诀表 public static void main(String[] args){ formula();} /** * for 循环实现9*9乘法口诀表 * &quo ...
- Java进程内缓存
今天和同事聊到了缓存,在Java中实现进程缓存.这里主要思想是,用一个map做缓存.缓存有个生存时间,过期就删除缓存.这里可以考虑两种删除策略,一种是起一个线程,定期删除过期的key.第二个是,剔除模 ...
- 初学orcale(一)
Oracle数据库学习: 01.数据库简介: (1)文件型数据库: Access Office组件: Foxpro (2)NoSql数据库(泛指非关系型数据库): NoSQL(NoSQL = Not ...
- Android 解决Glide 加载图片缓慢(第一次加载不出来图片)的Bug
- python在Android下的自动化测试用法
# This Python file uses the following encoding: utf-8from com.android.monkeyrunner import MonkeyRunn ...
- Business Component(BC)和Business Object(BO)
Siebel应用架构的一个成功的地方就是在应用里引入了BC,BO的概念,从而使得几千张关系数据表能够按照业务的含义组织成业务对象,对于业务人员而言具有了业务上的含义,而不仅仅是从技术人员的观点来对待数 ...