万能的搜索--之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 ...
随机推荐
- E20180427-hm
创建: 2018/04/27 dissolve vi. 溶解; 融化,液化; 解散,散去; 分裂,分解; vt. 使溶解; 使(固态物)溶解为液体,使液化; 使消失,使消逝,消除; 使终止; c ...
- Codeforces 550B 【暴力】
题意: 有n个数字, 要求在这n个数中选出至少两个数字, 使得它们的和在L,R之间,并且最大的与最小的差值要不小于x 思路: 撒比了啊... 根据状态的话一共也就是2^15-直接暴力,二进制的小魅力还 ...
- 继续(3n+1)猜想 (25)
#include <algorithm> #include <iostream> using namespace std; int main(){ ] = { }; ], nu ...
- iOS UITextView自适应高度UITextContainerView抖动问题
在打造一个类似于微信朋友圈评论输入框的时候,需要动态调整输入框的高度, 但是,在调整了UITextView的高度之后,继续输入会导致内容(UITextContainerView里的文字)抖动. scr ...
- sql server 获取数据字段(表的字段和类型信息)
获取数据字段(表的字段和类型信息) SELECT 表名= then d.name else '' end, 表说明= then isnull(f.value,'') else '' end, 字段序号 ...
- LCA最近公共祖先知识点整理
题解报告:hdu 2586 How far away ? Problem Description There are n houses in the village and some bidirect ...
- HTTP提交方式之PUT详细介绍及POST和PUT的区别
Http定义了与 服务器的交互方法,其中除了一般我们用的最多的GET,POST 其实还有PUT和DELETE 根据RFC2616标准(现行的HTTP/1.1)其实还有OPTIONS,GET,HEAD, ...
- qconbeijing2017
http://2017.qconbeijing.com/schedule 第一天 (2017年4月16日/星期日) 签到 专题 主题演讲 快速进化的容器生态 微服务与 DevOps 最佳实践(厂商 ...
- spring mvc 通过拦截器记录请求数据和响应数据
spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据 ...
- 微信小程序九宫格布局
先上效果图 使用注意事项 1:注意在app.json中注册页面路径 2:如果要增加新的Item,可到js中对listService数组进行增加 3:listService参数[ title:分类标题 ...