美文网首页
暴力搜索 | BFS

暴力搜索 | BFS

作者: zilla | 来源:发表于2019-07-24 19:10 被阅读0次

参考:《算法笔记》

广度优先搜索 breadth first search

  • 以广度为第一关键词
  • 碰到分叉口,总是依次访问从该分叉口能直接到达的所有结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点……
  • 如同水花荡开(按层次遍历,从初始点到某结点的最少步数即层数)
  • 借助队列实现:分叉口结点出队,与之直接相连的结点入队
  • ⚠️已入队过的结点要标记为已入队,不可重复入队。

题目

1091 Acute Stroke (30 分)

题目描述
思路
  • 可走的路:L * M * N矩阵中1结点到与之“相邻”1结点
  • BFS:找到矩阵中为1的结点(未访问过),以它为起点搜寻它相邻的1结点(标记为访问过),并计数1的结点个数。若大于等于阈值,则计入,否则丢弃。找下一个未访问过的1结点,继续……
  • ⚠️传参顺序,(z,x,y)要留意
#include <cstdio>
#include <queue>

using namespace std;
int MM, NN, LL, TH;
bool graph[60][130][1290] = {false}, visited[60][130][1290] = {false};

struct Node {
    int z, x, y;
};
int x_offsets[6] = {1, -1, 0, 0, 0, 0};
int y_offsets[6] = {0, 0, 1, -1, 0, 0};
int z_offsets[6] = {0, 0, 0, 0, 1, -1};

int BFS(int layer, int i, int j) {
    int sum = 1;
    visited[layer][j][i] = true;
    queue<Node> mq;
    mq.push(Node{layer, i, j});
    while (!mq.empty()) {
        Node curr_node = mq.front();
        mq.pop();
        for (int k = 0; k < 6; ++k) {
            int x = curr_node.x + x_offsets[k], y = curr_node.y + y_offsets[k], z = curr_node.z + z_offsets[k];
            if (x < 0 || x >= NN || y < 0 || y >= MM || z < 0 || z >= LL)
                continue;
            if (!visited[z][y][x] && graph[z][y][x]) {
                sum++;
                visited[z][y][x] = true;
                mq.push(Node{z, x, y});
            }
        }
    }
    return sum;
}

int main() {
    scanf("%d%d%d%d", &MM, &NN, &LL, &TH);
    int value;
    for (int i = 0; i < LL; ++i) {
        for (int j = 0; j < MM; ++j) {
            for (int k = 0; k < NN; ++k) {
                scanf("%d", &value);
                if (value) graph[i][j][k] = true;
            }
        }
    }
    int total = 0;
    for (int i = 0; i < LL; ++i) {
        for (int j = 0; j < MM; ++j) {
            for (int k = 0; k < NN; ++k) {
                if (graph[i][j][k] && !visited[i][j][k]) {
                    int curr = BFS(i, k, j);
                    if (curr >= TH)
                        total += curr;
                }
            }
        }
    }
    printf("%d\n", total);
    return 0;
}

相关文章

  • 暴力搜索 | BFS

    参考:《算法笔记》 广度优先搜索 breadth first search以广度为第一关键词碰到分叉口,总是依次...

  • BFS/DFS python模板与实现

    BFS BFS在搜索完第k层的节点之前,是不会搜索第k+1层的节点的。 BFS原理 BFS所用的是队列。把每个还没...

  • 搜索

    题目链接:搜索一·24点 dfs: 题目链接:搜索二·骑士问题 bfs: 题目链接:搜索三·八数码问题 bfs:

  • 算法与数据结构 之 搜索算法

    搜索分为广度优先搜索、深度优先搜索、A*算法。 一、广度优先算法(BFS) 1.1、基本实现和特性:BFS是从一个...

  • BFS和DFS

    BFS:广度优先搜索 DFS:深度优先搜索 树的遍历 BFS:A B C D E F G H I DFS: A ...

  • DFS与BFS LeetCode 刷题小结(一)

    本节我们将汇总一些 LeetCode bfs与dfs相关的题。 关于深度优先搜索(DFS)和广度优先搜索(BFS)...

  • 宽度优先搜索-(BFS)及例题详解

    宽度优先搜索-(BFS) 宽度(广度)优先搜索(BFS)是一种经典的的搜索算法,这种算法一般会遍历整个数据来寻找最...

  • BFS

    [TOC] BFS 和 DFS BFS广度有限搜索和DFS深度优先搜索算法是特别常用的两种算法 DFS 算法就是回...

  • bfs搜索路径

    bfs(二维数组方式储存图)使用queue来操作: bfs如果仅有一条最短路径,可直接设置flag结束遍历,因为广...

  • python-数据结构 队列和广度优先搜索(BFS)

    1.队列和广度优先搜索(BFS) 原题来自LeetCode 广度优先搜索(BFS)的一个常见应用是找出从根结点到目...

网友评论

      本文标题:暴力搜索 | BFS

      本文链接:https://www.haomeiwen.com/subject/sidfrctx.html