广度优先搜索(二)

【例5】 8数码难题

【问题描述】:

在 3 * 3 的棋盘上,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格。空格周围的棋子可以移到空格中。要求解的 问题是,给出一种初始布局 [ 初始状态 ] 和目标布局 [ 目标状态 ] ,找到一种移动的方法,实现从初始布局到目标布局的转变。

【输入格式】

输入由两行组成,每行9个数,分别表示初始状态和目标状态:

【输出格式】

有若干行,第一行表示最小步数 ,接下来的每行输出一步的状态,如果在6步内无法达到目标状态,输出“No solution!”。

【输入输出样例】

输入文件名: 8num.in

283164705

123804765

输出文件名:8num.out

5

283

164

705

283104765

203184765

023184765

123084765

123804765

【问题分析】:

这是一道典型的搜索题目,搜索产生的结点可以达到9!,再加上判重,如果不优化的话,耗时严重,关于广搜得优化我们后面的学习中再作讨论,本题只要求输出6步以内可以达到的目标,所以使用一般的广搜即可解决。问题是,如何在扩展结点的同时计算出已经走的步数,而不是找到目标状态后再逆序跟踪输出步数和步骤?

两种方法,一种是在队列中增加一个域,来记录扩展出当前状态用的步数,该步数是由它的父节点步数加1得到。

另一种方法是双尾指针法。广搜是按层次搜索的,每搜完一层,即可视为走完一步,所以,只要记录下来当前搜索了多少层即可。我们使用tail2记录当前扩展层最后一个节点在队列中的位置,当head指向tail2并且扩展完tail2,说明完成一层的搜索,此时step+1,并且tail2指向tail,也就是扩展出的新的一层的尾结点。

记录步数的广搜算法框架如下:

 1 Program Bfs;
 2 初始化,初始状态存入OPEN 表;
 3 队列首指针head:=0;尾指针 tail:=1;tail2:=1; step:=1;
 4 repeat
 5     指针head后移一位,指向待扩展结点;
 6     for I=1 to max do     {max为产生子结点的规则数}
 7     begin
 8       if 子结点符合条件 then
 9          begin
10            if新结点是目标结点 then 输出 else
11              if新结点与原已产生结点不重复 then tail 指针增1,把新结点存入列尾;
12          end;
13     end;
14  if head=tail2 then begin inc(step);tail2:=tail;end;
15 until(head>=tail);   {队列空}

另外我们需要考虑如何记录数码状态,可以使用3*3的二维数组,也可以使用长度为9的字符串。一般使用数组记录,实现起来比较简单,但是判重的时候比较麻烦,如果使用9维布尔数组来判重,那么需要很大的存储空间,不过速度会较快,如果使用字符串来记录,难以用布尔数组来判重,所以判重耗时巨大,但是字符串可以直接比较并且本题的规模也不大,只要判断6步以内是否能够达到目标状态,所以我们不妨使用字符串s来记录数码状态,用p来记录s中0的位置,0与其他数字的交换最多有四种情况:

与上方的数字交换则把p与p-3位置的字符交换位置;

与右边的数字交换则把p与p+1位置的字符交换位置;

与下方的数字交换则把p与p+3位置的字符交换位置;

与左边的数字交换则把p与p-1位置的字符交换位置;

注意特殊情况下,当p=4或7时,0不能与左边数字交换,当p=3或6时,0不能与右边数字交换,另外,所有的交换位置都不能超过1~9范围。

搜索算法_8数码难题1

AYYZOJ p1461

时间: 2024-10-12 02:46:46

广度优先搜索(二)的相关文章

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

SDUT 2142 【TEST】数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

步步为营(十六)搜索(二)BFS 广度优先搜索

上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起始状态的长度" 那么广度是什么呢? 个人认为,能够这么归纳: 何为广度? 能够看做"距离初始状态距离相等的结点"的集合 那么BFS的核心思想就是:从初始结点開始,搜索生成第一层结点.检查目标结点是否在这些结点中,若没有,再将全部第一层的结点逐一进行搜索,得到第二层结点,并逐一检查

ybt 1329 细胞 广度优先搜索 (二维,寻找符合条件节点)

1329:[例8.2]细胞 时间限制: 1000 ms         内存限制: 65536 KB提交数: 8535     通过数: 4744 [题目描述] 一矩形阵列由数字00到99组成,数字11到99代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 0234500067 1034560500 2045600671 0000000089 有44个细胞. [输入] 第一行为矩阵的行nn和列mm; 下面为一个n×mn×m的矩阵.

ybt 1252 广度优先搜索 走迷宫(二维、最小步数)

1252:走迷宫 时间限制: 1000 ms         内存限制: 65536 KB提交数: 7272     通过数: 3241 [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. [输入] 第一行是两个整数,R和C,代表迷宫的长和宽.( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫. 空地格子用‘.’表示,

[C++]广度优先搜索(BFS)(附例题)

广度优先搜索(BFS)(附例题) 问题产生: Isenbaev是国外的一个大牛. 现在有许多人要参加ACM ICPC. 一共有n个组,每组3个人.同组的3个人都是队友. 大家都想知道自己与大牛的最小距离是多少. 大牛与自己的最小距离当然是0.大牛的队友和大牛的最小距离是1.大牛的队友的队友和大牛的最小距离是2--以此类推. 如果实在和大牛没有关系的只好输出undefined了. 第一行读入n.表示有n个组.1 ≤ n ≤ 100 接下来n行,每行有3个名字,名字之间用空格隔开.每个名字的开头都是

算法_图的深度优先搜索和广度优先搜索

一.图的基本数据结构 图是由一组顶点和一组能够将两个顶点相互连接的边所构成的,一般使用0~V-1这样的数字形式来表示一张含有V个顶点的图.用v-w来指代一张图的边,由于是无向图,因此v-w和w-v是同一种边的两种表示方法.无向图是指边没有方向的图结构在无向图中,边仅仅表示的是两个顶点之间的连接.图的数据结构的可视化如下图所示(其中边上的箭头没有任何意义): 当两个顶点通过一条边相互连接,则称这两个顶点是相邻的.某个顶点的度数即为依附它的边的总数.当两个顶点之间存在一条连接双方的路径的时候,称为这

理解广度优先搜索

1.   定义 BFS是Breath First Search的缩写,是广度优先搜索的意思,是图的遍历方式的一种. 由于BFS是从起点一层一层的进行搜索的,所以凡是需要求最短路径的问题,都可以尝试看BFS能否解决,比如Dijkstra的单源最短路径算法使用了BFS的思想.另外,在执行广度优先搜索的过程中将构造出一棵树,这也是Prim的最小生成树算法思想.在做BFS的时候,有两点需要特别注意: 1.      为了防止搜索进入无限循环,节点需要判重,也就是已经访问过的节点不要再访问了,所以需要记录

图的表示、广度优先搜索、深度优先搜索

1.图的表示 a.邻接矩阵:适合稠密图(|E|接近|V|2) //用二维数组表示邻接矩阵 int G[|V|][|V|]; //初始化 for(int i=0;i<|V|;i++){ for(int j=0;j<|V|;j++){ if( (i,j) in E){ G[i][j] = 1;//or G[i][j] = weight[i][j]; } else if(i==j){ G[i][j] = 0; } else{ G[i][j] = MAX; } } } b.邻接表:适合稀疏图(|E|远

POJ 3009 Curling 2.0 {广度优先搜索}

原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The purpose