[C++]广度优先搜索(含C++模板)

广度优先搜索(含C++模板)

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

概述

BFS,其英文全称是Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)

算法描述

广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:

  • 1、把根节点放到队列的末尾。
  • 2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
  • 3、找到所要找的元素时结束程序。
  • 4、如果遍历整个树还没有找到,结束程序。

[C++]广度优先搜索(含C++模板)_第1张图片

对于不同的行走条件只需要改变node_array的参数即可。

//
//  main.cpp
//  work
//
//  Created by 颜泽鑫 on 5/20/16.
//  Copyright © 2016 颜泽鑫. All rights reserved.
//

#include 
#include 
using namespace std;
int map[22][22] = {0};
struct node {
    int x;
    int y;
    int step;
    node(int _x = 0, int _y = 0, int _step = 0) : x(_x), y(_y), step(_step) {
    }
};
node final = node();
node start = node();
int node_array[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int visited[22][22] = {0};

int find_map(int row, int col) {
    queue queue_node;
    while (!queue_node.empty()) {
        queue_node.pop();
    }
    queue_node.push(start);
    node top;
    visited[top.x][top.y] = 1;
    while (!queue_node.empty()) {
        top = queue_node.front();
        queue_node.pop();
        if (top.x == final.x && top.y == final.y) {
            return top.step;
        }
        for (int i = 0; i != 4; i++) {
            int node_x = top.x + node_array[i][0];
            int node_y = top.y + node_array[i][1];
            if (node_x >= 0 && node_y >= 0) {
                if (map[node_x][node_y] == 0 &&
                visited[node_x][node_y] == 0 && node_y < col && node_x < row) {
                    node temp = node(node_x, node_y, top.step + 1);
                    visited[node_x][node_y] = 1;
                    queue_node.push(temp);
                }
            }
        }
    }
    return -1;
}
int main(int argc, const char * argv[]) {
    int col, row;
    cin >> row >> col;
    for (int i = 0; i != row; i++) {
        for (int j = 0; j != col; j++) {
            char flag;
            cin >> flag;
            if (flag == '#' || flag == '!') {
                map[i][j] = 1;
            }
            if (flag == '.') {
                map[i][j] = 0;
            }
            if (flag == 'S') {
                start.x = i;
                start.y = j;
            }
            if (flag == 'E') {
                final.x = i;
                final.y = j;
            }
        }
    }
    cout << find_map(row, col) << endl;
    return 0;
}

你可能感兴趣的:(C++编程)