代码实现细节

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=;
const int dx[]={,,,-};
const int dy[]={,-,,};
int flag,now[N],goal[N];
int dis[N][N],a[N][N],mp[N][N];
inline int calcx(int x){return (x-)/+;}
inline int calcy(int x){return x%?x%:;}
inline int abs(int x){return x>?x:-x;}
inline int h(){int t=;for(int i=;i<=;i++) t+=dis[now[i]][goal[i]];return t;}
inline int check(){for(int i=;i<;i++) if(now[i]!=goal[i]) return ;return ;}
void dfs(int depth,int x,int y,int lim){
if(depth+h()>lim) return ;
if(check()){flag=;return ;}
for(int i=,nx,ny;i<;i++){
nx=x+dx[i];
ny=y+dy[i];
if(flag) return ;
if(nx>&&nx<=&&ny>&&ny<=){
swap(a[x][y],a[nx][ny]);swap(now[a[x][y]],now[a[nx][ny]]);
dfs(depth+,nx,ny,lim);
swap(a[x][y],a[nx][ny]);swap(now[a[x][y]],now[a[nx][ny]]);
}
}
}
void pre(){
for(int i=;i<=;i++)
for(int j=i+;j<=;j++)
dis[i][j]=dis[j][i]=calcx(j)-calcx(i)+abs(calcy(j)-calcy(i));
}
int main(){
pre();
goal[]=;goal[]=;goal[]=;goal[]=;goal[]=;goal[]=;goal[]=;goal[]=;goal[]=;
int sx,sy;
for(int i=,x,y,z;i<=;i++){
scanf("%1d",&z);
x=calcx(i);y=calcy(i);
mp[x][y]=z;now[z]=i;
if(!z) sx=x,sy=y;
}
for(int i=;;i++){
memcpy(a,mp,sizeof mp);
dfs(,sx,sy,i);
if(flag){printf("%d\n",i);break;}
}
return ;
}

luogu P1379 八数码难题(A*算法入门详细讲解)的更多相关文章

  1. [luogu]P1379 八数码难题[广度优先搜索]

    八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...

  2. luogu P1379 八数码难题

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

  3. 洛谷 P1379 八数码难题 解题报告

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

  4. 洛谷——P1379 八数码难题

    P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...

  5. 洛谷P1379八数码难题

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

  6. 洛谷 - P1379 - 八数码难题 - bfs

    https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...

  7. 洛谷—— P1379 八数码难题

    https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...

  8. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  9. 【洛谷】P1379 八数码难题(bfs)

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

随机推荐

  1. SecureCRT 用ssh key登录配置方法

    服务器端配置 OS: Debian-6.0.5 复制代码 代码如下: #apt-get install ssh 安装ssh服务 编辑/etc/ssh/sshd_config配置文件 复制代码 代码如下 ...

  2. day day up

    复位与时钟控制器 RCC(Reset Clock Controller) 通用输入输出 GPIO(General Purpose Input/Output) 嵌套向量中断控制器 NVIC(Nested ...

  3. Game publishing request was abnormally terminated (ID 27492).

    本地可以正常发布:远程发布报错.怀疑跟直接删除数据库记录有关,wp_myarcadegames/wp_posts Game publishing request was abnormally term ...

  4. kettle优化

    http://blog.csdn.net/cissyring/archive/2008/05/29/2494130.aspx 1. Join 我得到A 数据流(不管是基于文件或数据库),A包含fiel ...

  5. [JS] selector 背景选择器

    用于listview和button改变android原来控件的背景 android的selector是在drawable/xxx.xml中配置的 1.定义xml 把下面的XML文件保存成你自己命名的. ...

  6. 数据库之“on”“where”区别

    数据库在通过连接两张或者多张表返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户 在使用inner join(内连接)没有区别,但是 在使用left jion时,on和where条件的 ...

  7. 关于Cocos2d-x中坐标系的种类和转换

    注意: 当一个节点有一个子节点的时候,如果移动父节点,子节点也会跟着做相应的移动变化,只要被添加到父节点中,子节点就被绑定了,所以子节点的位置,坐标就会被动地变化. 当一个节点有一个子节点的时候,如果 ...

  8. MongoDB 启动基于角色的登录认证功能

    参见:https://help.aliyun.com/knowledge_detail/37451.html 步骤一:在未开启认证的环境下,登录到数据库 [mongodb@rac3 bin]$ ./m ...

  9. e680. 使三元色图像变明变暗

    This example demonstrates how to brighten or darken an RGB buffered image by scaling the red, green, ...

  10. C#有关的vshost、exe、config格式说明

    vshost.exe.config是程序运行时的配置文本 exe.config是程序运行后会复制到vshost.exe.config app.config是在vshost.exe.config和exe ...