接着(一)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(三)的更多相关文章

  1. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  2. Leetcode之广度优先搜索(BFS)专题-详解429. N叉树的层序遍历(N-ary Tree Level Order Traversal)

    Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal) 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右 ...

  3. Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)

    Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...

  4. Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)

    Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree ...

  5. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  6. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  7. 队列的JS实现及广度优先搜索(BFS)的实现

    队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾:删除操作叫做出队,只能移除第一个元素.在JS中,用数组可以很简单的实现队列.JavaScript实现排序算法 functi ...

  8. Z1. 广度优先搜索(BFS)解题思路

    /** BFS 解题思路 特点:从某些特定的节点开始,感染相邻的节点; 被感染的节点,再感染其相邻的节点,以此类推. 题目常见于数据结构包括 二维数组.树.图 **/ /** 1). 二维数组特定节点 ...

  9. Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)

    Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

随机推荐

  1. 解决sqlserver的sql脚本内存不足问题

    1.Win+R输出cmd 2.sqlcmd -i  E:\Work\xxxxx.sql -d xxxxx(数据库名称) -s 127.0.0.1

  2. POJ3250【单调栈】

    思路: 维护一个单调递增的栈,对于栈顶元素<=新值来说,那么后面的,我一定看不到了,pop掉以后,那么这时候的栈的大小就是我能看到的这个刚刚pop出去元素的个数. //#include < ...

  3. 51nod 1428【贪心】

    思路: 就是先排序,然后对每个取最小的结束时间. #include <bits/stdc++.h> using namespace std; typedef long long LL; c ...

  4. Caffe实战一(环境准备及CPU模式下编译)

    经过前几天的折腾,终于把Ubuntu16.04开发环境给搭建了起来,包括win10+Ubuntu双系统的安装.系统安装后的优化等等. 详见之前的文章:Ubuntu16.04.2 LTS 64bit系统 ...

  5. python实现基数排序

    # 基数排序有着局限性,只能是整数,# 排序的时候要先排后面一个条件的(多条件排序)#如本例中,先从个位开始排起# 多关键字排序# 从低关键字开始排序 # @File: radix_sort #### ...

  6. python中的栈

    # @File: stack # 列表实现栈 class MyStack(object): def __init__(self): self.data = [] def push(self, item ...

  7. Brush (III) LightOJ - 1017

    Brush (III) LightOJ - 1017 题意:有一些点,每刷一次可以将纵坐标在区间(y1,y1+w)范围内的所有点刷光,y1为任何实数.最多能刷k次,求最多共能刷掉几个点. 先将点按照纵 ...

  8. Cannot call sendRedirect()/forward after the response has been committed的问题

    问题其实已经很明确了,说明就是不能重定向,因为已经有response了. 然后一检查,是前面已经用servlet的printWriter打印东西了. 所以,重定向前 必须先保证没有任何的输出,包括:1 ...

  9. C8051特点

    C8051与传统51的区别在于优先权交叉开关.系统时钟.SFR寄存器几个方面: 一 优先权交叉开关:传统的51外设功能是固定分配或者复用分配到指定引脚,而C8051则是通过优先权交叉开关设置,即要想分 ...

  10. RHEL 6.5----LVS(DR)

    主机名 IP  所需软件  master eth0==>192.168.30.140(Nat) eth0:1==>192.168.17.130(Nat) ipvsadm node-1 et ...