八数码问题

【题意】

编好为1~8的8个正方形滑块摆成3行3列(一个格子为空),如图所示

每次可以移动空格相邻的滑块到空格,要计算出能移动出目标局面的最小步数,如无法达到则输出-1。

【分析】

我们可以把每一种局面定义为一种“状态”,而每个状态就是由9个格子的编号依次排列组成,如上图左的状态为:1,5,2,4,3,0,7,8,6,同理右的状态为:1,2,3,4,5,6,7,8,0。然后我们可以用宽度优先遍历搜索(BFS)的方法,对每一种状态都进行扩展出新的状态,然后知道搜索出目标状态为止。

【代码】

typedef int State[9];		//定义“状态”类型
const int Maxstate = 1000000;
State st[Maxstate],goal; //状态数组
int dist[Maxstate];
//如果要打印方案,还要定义一个父亲编号数组 int fa[Maxstate]; const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1}; void init(){} //初始化函数 int bfs()
{
init();
int front=1;
int rear=2;
while(front<rear)
{
State& s = st[front];
if(memcmp(goal,s,sizeof(s))==0) return front;
int z;
for(z=0;z<9;z++) if(!s[z]) break;
int x=z/3,y=z%3;
for (int d=0;d<4;d++)
{
int newx=x+dx[d];
int newy=y+dy[d];
int newz=newx*3+newy;
if(newx>=0 && newx<3 && newy>=0 &&newy<3)
{
State& t=st[rear];
memcpy(&t,&s,sizeof(s));
t[newz]=s[z];
t[z]=s[newz];
dist[rear]=dist[front]+1;
if(insert(rear)) rear++; //判重
}
}
front++;
}
return 0;
}

上面这段代码缺少一个main()函数,一个init()函数和一个判重的insert()函数,我觉着比较重要的一个点时定义“状态”类型的写法,我开始觉着应该是typedef int[9] State这么写的,但是不对,具体为什么要那么写我也不清楚,反正很容易写错。然后就是最关键的bfs函数中用了很多“引用”,这可以学习一下,这样做很方便,比指针好理解。




【C++算法设计】八数码问题的更多相关文章

  1. A*算法解决八数码问题 Java语言实现

    0X00 定义 首先要明确一下什么是A*算法和八数码问题? A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法也是一种启发性的算法,也是解决许多搜索问题的有效算法.算法中的距离估 ...

  2. Java实现 蓝桥杯 算法提高 八数码(BFS)

    试题 算法提高 八数码 问题描述 RXY八数码 输入格式 输入两个33表格 第一个为目标表格 第二个为检索表格 输出格式 输出步数 样例输入 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 ...

  3. A*算法(八数码问题)

    #include <iostream> #include <cstring> #include <vector> #include <cmath> #i ...

  4. A*算法 -- 八数码问题和传教士过河问题的代码实现

    前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...

  5. HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法

    先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...

  6. HDU 1043 Eight 八数码问题 A*算法(经典问题)

    HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...

  7. 八数码难题之 A* 算法

    人生第一个A*算法-好激动-- 八数码难题--又称八数码水题,首先要理解一些东西: 1.状态可以转化成整数,比如状态: 1 2 3 4 5 6 7 8 0 可以转化成:123456780这个整数 2. ...

  8. 【算法】BFS+哈希解决八数码问题

    15拼图已经有超过100年; 即使你不叫这个名字知道的话,你已经看到了.它被构造成具有15滑动砖,每一个从1到15上,并且所有包装成4乘4帧与一个瓦块丢失.让我们把丢失的瓷砖“X”; 拼图的目的是安排 ...

  9. 八数码(IDA*算法)

    八数码 IDA*就是迭代加深和A*估价的结合 在迭代加深的过程中,用估计函数剪枝优化 并以比较优秀的顺序进行扩展,保证最早搜到最优解 需要空间比较小,有时跑得比A*还要快 #include<io ...

随机推荐

  1. GDAL python教程(1)——用OGR读写矢量数据

    本教程的讲义和源码都是取自Utah State University的openGIS课程 相关资料,包括讲义.源码.数据样例,请从此处下载http://www.gis.usu.edu/~chrisg/ ...

  2. COB (Chip On Board) 製程介紹/簡介/注意事項 I

    COB (Chip On Board)在電子製造業並不是一項新鮮的技術,但最近我卻常常被問到相關的問題及資料索取.也許真的是產品越來越小了,而較進階的技術又太貴,所以又有人回過頭來考慮COB的製程. ...

  3. TLSAlloc()

    为什么要有TLS?原因在于,进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量.在一个线程修改的内存内容,对所有线程都生效.这是一个优点也是一个缺点.说它是优点,线 ...

  4. POJ 2400 最小权匹配

    吐槽:首先,这道题的输入居然是错的.要将上下两个矩阵的位置换一下才可以出样例,也就是上面那个矩阵是employee对Supervisor的打分,下面那个矩阵才是Supervisor对employee的 ...

  5. centos6 qt ENV

    打算做嵌入式图像处理,计划方案嵌入式Linux+OpenCV+QT,昨天简单入门OpenCV今天看看QT,QT就先弄Linux下面的,回家之前争取把基本的摸通,然后能在板子上跑起来 关于QT安装 QT ...

  6. 关于jquery的each的操作;

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Solrj日期范围查询

    在做依据日期来检索的时候普通的格式化会出错,试了好多种仅仅有一种可行 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH ...

  8. UI_拖动View

    方法一 在touchesMoved中 // 获取到触摸的手指 UITouch *touch = [touches anyObject]; // 获取集合中对象 // 获取開始时的触摸点 CGPoint ...

  9. getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用

    getCacheDir()方法用于获取/data/data/<application package>/cache目录 getFilesDir()方法用于获取/data/data/< ...

  10. HTTP的报文格式解析

    一.概述 http报文是面向文本的,报文中每一个字段都是一些ASCII码串,各个字段的长度是不确定的.http有两类报文:请求报文  响应报文 二.请求报文 一个http请求报文由 请求行(reque ...