八数码(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”; 拼图的目的是安排 ...
随机推荐
- 设置Log文件每天生成一个(wamp)
打开 Wamp的 httpd.conf文件 把下面两句话拷贝进去即可: 1.设置错误log的, " 2.设置访问log的 " common 说明:bin/rota ...
- [Activator- HelloAkka] Define our Messages
An Actor does not have a public API in terms of methods that you can invoke. Instead its public API ...
- FZU 1924——死锁——————【topo判环】
死锁 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pr ...
- git使用方法记录
git是一个分布式的代码版本管理系统,使用起来的确很方便,已签只会star别人的项目,今天刚好有空抽点时间学了一下,简单的几个命令的用法. 首先在giuhub上可以托管代码,然后可以将远程仓库拖到本地 ...
- 【linux】基础操作命令
1.查找文件或者程序位置 root@ROUTER:~# which is hostapd/sbin/hostapd
- 【Ubuntu】Vritual Box 复制方式克隆
重装系统后之前安装的虚拟机的镜像全都不见了 ,因为重装系统盘C盘会全部重新被格式化. VtritualBox如果没有指定虚拟机存放位置,默认是会放在C盘的,C:\Users\Administrator ...
- c#-FrameWork02泛型
泛型 l 泛型(generic)编程是一种编程范式,它利用”参数化类型”将类型抽象化,从而可以实现更为灵活的复用.把数据类型参数化 sh泛型集合 泛型集合与集合的对比 泛型集合类 非泛型集合类 Li ...
- Mysql 语句执行顺序
1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西? 在开发中涉及到数据库,基本上只用到了sql语句,如何写sql以及对其进行优化就比较重要,那些mysql的厚本书籍针对的是DBA,我们只需 ...
- jQuery基础——选择器、效果
一.使用JS的痛处 在学习和使用js的过程中发现了js的一些痛处: 1.书写繁琐,代码量大. 2.代码复杂. 3.动画效果很难实现.使用定时器,要小心各种定时器的清除.各种操作和处理事件不好实现. 4 ...
- 对HTML的大致了解
HTML的全称是Hyper Text Markup Language(超文本标记语言),是一种标记语言.其中,HTML文档一个重要的.广泛使用的标准HTML4.01是在1999年12月24日由W3C组 ...