万能的搜索--之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 ...
随机推荐
- hihocoder 1584 Bounce(找规律)
传送门 题意 略 分析 我们观察几张图 发现菱形的边长为n-1和m-1的公约数 将图简化一下 接下来我们计算只经过一次的点,分成两类 1.与边相交 num1=x+y 2.未与边相交,在菱形内 num2 ...
- Codeforces627A【数学·有意思】
题意: 求有多少对( a , b ),a+b=s,a^b=x.(正整数) 思路: a+b=a^b+a&b*2; #include <iostream> #include <c ...
- 黑客攻防技术宝典web实战篇:查找源代码中的漏洞习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 列出 3 种可在源代码中找到明确签名的常见漏洞. (a) 跨站点脚本(b) SQL 注入( ...
- print打印
print打印输出的优点是简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看缺点是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息 __________ ...
- PHP读取MySQL数据
方法/步骤 先配置一下数据库: define("DB_HOST","localhost");//数据库地址,一般为localhost define(&q ...
- Qt之对话框QDialog
这一节主要讲述对话框类,先讲述两种不同类型的对话框,再介绍Qt提供的几个标准对话框.对应本节的内容,可以在帮助索引中查看 QDialog 和 Dialog Windows 关键字. 一.模态和非模态对 ...
- Milking Grid POJ - 2185 || 最小覆盖子串
Milking Grid POJ - 2185 最小覆盖子串: 最小覆盖子串(串尾多一小段时,用前缀覆盖)长度为n-next[n](n-pre[n]),n为串长. 当n%(n-next[n])==0时 ...
- PopupWindow(1)简介
PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义显示,并且里面的监听组件,进行相应的操作,但它与Dialog又有很大的区别,PopupWindow只是弹出 ...
- 常见的问题:https://localhost:1158/em 无法打开
常见的问题:https://localhost:1158/em 无法打开 安装了Oracle Database 11g,里面有个基于网页的管理工具“https://localhost:1158/em” ...
- 529 Minesweeper 扫雷游戏
详见:https://leetcode.com/problems/minesweeper/description/ C++: class Solution { public: vector<ve ...