广度优先算法BFS

package myalgorithm;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
/*BFS用于记录的位置和值的结构*/
class node
{
    node(int xparam,int yparam,int valparam)
    {
        this.x = xparam;
        this.y = yparam;
        this.value = valparam;
    }
    int x,y,value;
}
public class ShortPath {
    /*全局最短路径*/
    public int stepnum = 999;
    /*构建11*11的迷宫,英雄H在(1,1)的位置出发,去解救美女M(6,8)*/
    char[][] graph = {
            {‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘},
            {‘#‘,‘H‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘*‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘*‘,‘#‘},
            {‘#‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘M‘,‘_‘,‘#‘},
            {‘#‘,‘*‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘},
    };
    /*初始标记数组都为0*/
    public int[][] mark = new int[graph.length][graph.length];
    /*每一个位置有四种选择:右下左上*/
    public int[][] choose = {
            {0,1},
            {1,0},
            {0,-1},
            {-1,0}
    };
  /*BFS算法*/
    public void BFS(node startPoint)
    {
        //起始点装入队列
        Queue<node> queue = new LinkedList<node>();
        startPoint.value = 1;//确保起始步数为1
        queue.offer(startPoint);

        node t1;
        int tx,ty;
        top:
        while(!queue.isEmpty())
        {
            //取队首,出队后不再入队,value也自此固定
            t1 = queue.poll();
            mark[t1.x][t1.y] = t1.value;//标记步数
            for(int i=0;i<4;i++)
            {
                tx = t1.x + choose[i][0];
                ty = t1.y + choose[i][1];

                //找到美女,肯定是最短的,可以立即返回
                if(graph[tx][ty] == ‘M‘)
                {
                    stepnum = t1.value + 1;//下一步可到
                    mark[tx][ty] = stepnum;
                    break top;
                }
                //继续接着找,把空路径添加到队列末尾
                //不是炸弹和围墙,并且没有被标记
                if(graph[tx][ty] != ‘#‘
                        && graph[tx][ty] != ‘*‘
                        &&mark[tx][ty] == 0)
                {
                    queue.offer(new node(tx,ty,t1.value+1));
                }
            }
        }
    }
    /*BFS回溯路径*/
    private void getPath(node target) {

        int beforex = 0,beforey = 0;
        int x = target.x;
        int y = target.y;
        for(int i=0;i<4;i++)
        {
            beforex = x + choose[i][0];
            beforey = y + choose[i][1];
            //找到英雄的出发点,函数结束
            if (beforex == 1 && beforey == 1)
            {
                return;
            }
            if(mark[x][y] - 1 == mark[beforex][beforey])
            {
                System.out.print("("+beforex+","+beforey+")<--");
                break;
            }
        }
        getPath(new node(beforex,beforey,0));
        return;
    }    /*main函数*/
    public static void main(String[] args) {
        ShortPath my = new ShortPath();

        long start = System.currentTimeMillis();
        my.BFS(new node(1,1,0));
        long end = System.currentTimeMillis();
        System.out.println("BFS step: " + my.stepnum + " time:" + (end-start));
        //打印标记结果
        for (int m = 0;m<my.graph.length;m++)
            System.out.println(Arrays.toString(my.mark[m]));
        //打印巡回路径
        my.getPath(new node(6,8,0));
    }

}

BFS step: 13 time:4
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 0, 7, 8, 0, 10, 11, 0]
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]
[0, 3, 0, 5, 6, 7, 0, 9, 10, 11, 0]
[0, 4, 5, 6, 0, 8, 9, 10, 11, 0, 0]
[0, 5, 6, 7, 8, 9, 10, 0, 12, 0, 0]
[0, 6, 0, 8, 9, 10, 11, 0, 13, 0, 0]
[0, 0, 10, 9, 0, 11, 0, 0, 0, 0, 0]
[0, 0, 11, 10, 11, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(5,8)<--(4,8)<--(4,7)<--(4,6)<--(4,5)<--(3,5)<--(3,4)<--(3,3)<--(2,3)<--(2,2)<--(2,1)

时间: 2024-12-20 01:20:12

广度优先算法BFS的相关文章

OpenCV二值图求最大连通区域算法(广度优先算法 BFS)

#include <iostream> #include <opencv2\opencv.hpp> #include <vector> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <windows.h> #include <math.h> #include <queue> using namespace std;usin

【算法导论】--C++实现广度优先搜索bfs

一.题目 根据上次随机生成的100个顶点的无向图和有向图,对其进行广度优先搜索. 二.理解广度优先搜索 广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的. [课上老师是这样说的,大家想象一下,发现其实非常形象] 广度优先搜索总是从一个起始点出发,首先扩散这个点周围所有的邻居,然后邻居在去扩散邻居的邻居(*^-^*)...然后一直到最后将整张图都扩散完. 三.代码实现 对于第一次随机生成100个顶点的图进行了细节的修改,将每个顶点的类型改为了自

BFS广度优先算法的思路

广度优先算法的思想是 对所有的Node进行遍历 然后将第一个Node入队列 设置其visited为真 然后 对第一个Node跟其它剩余的Node进行遍历对比 找出连通的Node 并将其visited属性赋值为真 然后将其入队列 接下来对队列里面的Node进行迭代处理 最终完全遍历所有节点

【算法日记】广度优先算法

广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止.广度优先搜索让你能够找出两样东西之间最短的距离.在学习这个算法之前我们要了解图的概念 1.什么是图 如上图所示.图是有节点和边组成的.一个节点可能和很多节点直接相连,这些相

广度优先算法:迷宫问题

广度优先算法: 模拟队列:数据量较小,需要打印路径坐标 STL队列:数据量较大,只需要打印步数 迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. Input 一个5 × 5的

广度优先遍历-BFS、深度优先遍历-DFS

广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3....wn的所有未被访问的邻接顶点:再从这些访问过的顶点出发,再访问它们所有未被访问过的邻接顶点......依次类推,直到图中的所有点都被访问为止.类似的思想还将应用于Dijkstra单源最短路径算法和Prim最小生成树算法. python实现二叉树的建立以及遍历(递归前序.中序.后序遍历,队栈前

深度&amp;&amp;广度优先算法

深度&&广度优先算法 1.爬虫系列 深度&广度优先搜索 介绍 1.DFS(Depth-First-Search)深度优先搜索,是计算机术语,是一种在开发爬虫早期使用较多的方法, 是搜索算法的一种.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) . 深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到这个HTML文件,再继续选择该HTML文件中的其他超链. 当不再有其他超链可选择时,说明搜索已经结束. 深度优先搜索是一个递归的过程 2.深度优先

HDU 1026 Ignatius and the Princess I (基本算法-BFS)

Ignatius and the Princess I Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large labyrinth. To make the problem si

ppt 图的基本算法 Bfs

输入: 8 91 21 32 42 53 63 74 85 86 7 // 图的BFS,使用C++队列#include <stdio.h>#include <string.h>#include <queue>using namespace std;#define N 10int g[N][N],bz[N],n,m;queue <int> q;void BFS(int cur){ int j; bz[cur]=1; q.push(cur); while (!q