万能的搜索--之BFS(三)
接着(一)start
(二)广度优先搜索(BFS)
广度优先搜索(又称宽度优先搜索算法)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。 Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
广搜的核心思想就是:从初始结点开始,产生第一层节点,检查目标结点是否在这些后继结点之中,没有,就扩展第一层节点,若没有,用产生式规则得到第二层节点;检查目标结点是否在这些后继结点之中,没有,就扩展第 二层节点……像这样以此扩展节点、检查,直到发现目标结点为止。
优点:
找到的第一个解一定是最优解
缺点:
占用空间比较大
经典题:八数码问题、
在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。
给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
伪代码:
初始状态加入队列
while 队列非空
获取当前队首状态
for 当前状态可能的下一状态st
if 该状态之前未被搜索到
if 该状态为目标状态
输出并退出
else
加入队尾
如何判重:
如何判断某一状态之前是否出现过?
将状态转换为一个数字(Hash)
举例
abac(字符串)转化为数字
0 * 26^3 + 1 * 26^2 + 0 * 26 + 2
矩阵转化为数字
具体代码实现:
#include<stdio.h> struct node
{
int xy[][];
int dir;
};
struct node sh[], end;
int count = ; void init()
{
printf("输入起始节点的位置:\n");
int i, j;
for (i = ; i < ; i++)
for (j = ; j < ; j++)
scanf("%d", &sh[].xy[i][j]);
sh[].dir = -;
printf("输入目标节点的位置:\n");
for (i = ; i < ; i++)
for (j = ; j < ; j++)
scanf("%d", &sh[].xy[i][j]);
sh[].dir = -;
} //找出0的位置
int loction(int num)
{
int i;
for (i = ; i < ; i++)
if (sh[num].xy[i / ][i % ] == ) return i;
} //进行标记
long long sign(int num)
{
long long sum;
sum = sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][]* + sh[num].xy[][];
return sum;
} void mobile(int num)
{ int temp;
int loc;
int up = , down = , left = , right = ;
loc = loction(num);
int stand = sh[num].dir;
//dir的0 1 2 3分别代表左 上 右 下
if (loc / != && stand != )
{
sh[count] = sh[num];
temp = sh[count].xy[loc / ][loc % ];
sh[count].xy[loc / ][loc % ] = sh[count].xy[loc / - ][loc % ];
sh[count].xy[loc / - ][loc % ] = temp;
sh[count].dir = ;
count++;
};
if (loc / != && stand != )
{
sh[count] = sh[num];
temp = sh[count].xy[loc / ][loc % ];
sh[count].xy[loc / ][loc % ] = sh[count].xy[loc / + ][loc % ];
sh[count].xy[loc / + ][loc % ] = temp;
sh[count].dir = ;
count++;
}
if (loc % != && stand != )
{
sh[count] = sh[num];
temp = sh[count].xy[loc / ][loc % ];
sh[count].xy[loc / ][loc % ] = sh[count].xy[loc / ][loc % - ];
sh[count].xy[loc / ][loc % - ] = temp;
sh[count].dir = ;
count++;
}
if (loc % != && stand != )
{
sh[count] = sh[num];
temp = sh[count].xy[loc / ][loc % ];
sh[count].xy[loc / ][loc % ] = sh[count].xy[loc / ][loc % + ];
sh[count].xy[loc / ][loc % + ] = temp;
sh[count].dir = ;
count++;
} }
void display(int num)
{
int i, j;
for (i = ; i < ; i++)
{
for (j = ; j < ; j++)
printf("%d ", sh[num].xy[i][j]);
printf("\n");
}
} int search()
{
int i = ;
while ()
{
printf("\n");
display(i);
printf("\n");
if (i == )
{
printf("超出了上限次数\n");
return ;
}
if (sign(i) == sign())
{
printf("在第%d次找到了", i);
display(i);
return i;
}
mobile(i);
i++;
}
} int main()
{
init();
search();
return ;
}
未完.....
万能的搜索--之BFS(三)的更多相关文章
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- Leetcode之广度优先搜索(BFS)专题-详解429. N叉树的层序遍历(N-ary Tree Level Order Traversal)
Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal) 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右 ...
- Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)
Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...
- Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)
Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 队列的JS实现及广度优先搜索(BFS)的实现
队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾:删除操作叫做出队,只能移除第一个元素.在JS中,用数组可以很简单的实现队列.JavaScript实现排序算法 functi ...
- Z1. 广度优先搜索(BFS)解题思路
/** BFS 解题思路 特点:从某些特定的节点开始,感染相邻的节点; 被感染的节点,再感染其相邻的节点,以此类推. 题目常见于数据结构包括 二维数组.树.图 **/ /** 1). 二维数组特定节点 ...
- Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)
Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
随机推荐
- Gradle系列之三 Gradle概述以及生命周期
1 Gradle是一种编程框架 gradle主要由以下三部分组成 1 groovy核心语法 2 build script block 3 gradle api 注:本章所有的代码都在 https:// ...
- HDOJ4857【拓扑排序】
首先 CLJ ORZ 这道题做了两次,第一次瞎搞... 第二次,好吧,骄傲地说水过... 题意:不说了: 思路: 题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来: 第一次做的时候,我记得我 ...
- Cg(C for Graphic)语言表达式与控制语句(转)
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 在上一章中,我们已经介绍了 Cg 语言的 ...
- 第十篇 .NET高级技术之委托
委托是一种可以指向方法的数据类型,可以声明委托类型变量. 声明委托的方式:delegate返回值类型 委托类型名(参数) 比如delegate void MyDel(int n) 注意这里的除了前 ...
- chrome调试中resource改到application中了
如题,看视频的时候发现在resource下面查看cookie,但是自己试的时候发现没有了这个工具, google之后发现原来该位置了
- SpringBoot | contrller的使用
@Controller 处理http请求 @RestController Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controller @RequestMap ...
- Python入门小练习 002 批量下载网页链接中的图片
我们常常需要下载网页上很多喜欢的图片,但是面对几十甚至上百张的图片,一个一个去另存为肯定是个很差的体验. 我们可以用urllib包获取html的源码,再以正则表达式把匹配的图片链接放入一个list中, ...
- 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列
题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...
- linux实现多台服务器文件同步
inotify-tools+rsync实时同步文件安装和配置 Linux+Nginx+PHP+MySQL+MemCached+eaccelerator安装优化记录(见 http://www.linux ...
- adb logcat教程
1.速查 $adb logcat -g //打印和缓冲区使用情况 $adb logcat -c main //清除main缓存区 $adb logcat -v threadtime -f /data/ ...