八数码(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”; 拼图的目的是安排 ...
随机推荐
- sqlplus连接oracle语法
sqlplus文件在product\11.2.0\dbhome_1\BIN目录下. 连接语法:用户名/密码@ip/服务名
- 生产者与消费者模式-阻塞 wait,notify
设计思路:生产者push ,消费者 拿,篮子装,syncstack先进后出,while 判断 index=0 wait, 当 Producer生产了 并push到篮子里 notify(唤醒 ...
- thinkphp执行流程
1. 入口文件index.php 用户对url的访问首先被定位到http://<serverIp>/<appName>/index.php, 这里的入口文件index.php做 ...
- matlab安装过程的被要求的配置程序
顺序是这样的: 网址的顺序是这样的: 1. http://cn.mathworks.com/support/compilers/R2015b/index.html?sec=win64&s_ci ...
- MATLAB-R2015b-win64安装详细教程
1.首先下载以下文件 链接:https://pan.baidu.com/s/1eRAOKZw 密码:5nkj 2.双击R2015b_win64.iso打开(win8,win8.1,win10均可直接打 ...
- TerraBuilder创建地形之去除影像黑边,填充影像
最近在Skyline项目中使用TerraBuilder创建地形,由于地形比较大,分块下载卫星影像,然后再TerraBuilder中合并,由于合并.图形等等问题,导致创建处理出来的地形中存在严重的缝隙和 ...
- 信鸽推送 C#版SDK
信鸽官方sdk没提供C#版的DEMO,考虑到应该有其他.NET的也会用到信鸽,下面是我在使用信鸽过程中写的demo.有什么不对的地方,欢迎各位大牛指导. 使用过程中主要是有2个问题: 1.参数组装,本 ...
- cf1072D. Minimum path(BFS)
题意 题目链接 给出一个\(n \times n\)的矩阵,允许修改\(k\)次,求一条从\((1, 1)\)到\((n, n)\)的路径.要求字典序最小 Sol 很显然的一个思路是对于每个点,预处理 ...
- jQuery判断checkbox是否选中?操作checkbox(不)选中?
HTML <form action=""> <input type="checkbox" name="c ...
- jdk时区相差8小时
设置JVM的默认时区为东八区(北京时间)在下面四个目录(jre6\lib\zi\Etc.jre6\lib\zi.jdk1.6.0_18\jre\lib\zi\Etc.jdk1.6.0_18\jre\l ...