首页 > 编程语言 >洪水填充算法

洪水填充算法

时间:2023-12-12 14:34:51浏览次数:37  
标签:dist 填充 ny 洪水 dfs nx int 算法

什么是洪水填充算法?

洪水填充(Flood fill)算法:从一个起始结点开始把附近与其连通的节点提取出或填充成不同颜色颜色,直到封闭区域内的所有节点都被处理过为止,是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。

Info: 常见的洪水填充算法,一般是4邻域填充,或是8邻域填充。

洪水填充算法的dfs实现

#include <bits/stdc++.h>
using namespace std;

int n, m, ans;
char a[105][105]; //给定区域n行m列,并假设均小于100


void dfs(int x, int y) {
    // 越界则结束
    if (x < 1 || y < 1 || x > n || y > m) return;
    // 不是石油区域结束
    if (a[x][y] != '@') return;
    a[x][y] = '*'; // 相当于标记已走过
    //8个方向探索
    dfs(x-1, y-1);
    dfs(x-1, y);
    dfs(x-1, y+1);
    dfs(x, y-1);
    dfs(x, y+1);
    dfs(x+1, y-1);
    dfs(x+1, y);
    dfs(x+1, y+1);
}

int main() {
    //保存地图
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
        
    // 遍历地图
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] == '@') {
                dfs(i, j);
                ans++;
            }
        }
    }
    cout << ans;
    return 0;
}

洪水填充算法的bfs实现

#include <bits/stdc++.h>
using namespace std;

int n, m, ans;
char a[105][105]; //给定区域n行m列,并假设均小于100

void bfs(int x, int y) {
    queue <int> qx, qy;
    int dist[105][105];
    int dx[8] = {-1,-1,-1,0,0,1,1,1};
    int dy[8] = {-1,0,1,-1,1,-1,0,1};
    
    qx.push(x), qy.push(y);
    memset(dist, 0x3f, sizeof dist); //初始化为无限大,用来表示没走过
    dist[x][y] = 0;
    a[x][y] = '*';
    
    while (!qx.empty()) {
        int x = qx.front(), y = qy.front();
        qx.pop(), qy.pop();
        for (int i = 0; i < 8; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx < 1 || ny < 1 || nx > n || ny > m) continue;
            if (dist[nx][ny] != 0x3f3f3f3f) continue;
            
            dist[nx][ny] = dist[x][y] + 1;
            a[nx][ny] = '*';
            qx.push(nx), qy.push(ny);
        }
    }
}

int main() {
    //保存地图
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
        
    // 遍历地图
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] == '@') {
                bfs(i, j);
                ans++;
            }
        }
    }
    cout << ans;
    return 0;
}

标签:dist,填充,ny,洪水,dfs,nx,int,算法
From: https://www.cnblogs.com/luliusheng/p/17896719.html

相关文章

  • 算法效率中的基本概念
    算法复杂度是一个必考的知识点,常常出现在阅读程序题中,让考生进行判断。1.先理解算法模板的复杂度计算2.再尝试套用初赛题目中的复杂度计算3.递归算法的复杂度可以展开计算算法效率是评估算法性能的一个关键指标,一般而言分析算法效率的方式有两种:时间复杂度空间复......
  • 高并发情况下的漏桶算法(javascript版)
    classLeakyBucket{//高并发情况下的漏桶算法 constructor(capacity,leakRate){//创建一个容量为capacity,每秒漏水量为leakRate的漏桶 this.capacity=capacity; this.leakRate=leakRate; this.water=0; this.lastLeakTime=Date.now(); ......
  • 【算法】【线性表】最长公共前缀
    1 题目给k个字符串,求出他们的最长公共前缀(LCP)样例1:输入:k个字符串=["ABCD","ABEF","ACEF"]输出:"A"解释:公共最长前缀是"A".样例2:输入:k个字符串=["ABCDEFG","ABCEFG","ABCEFA"]输出:"ABC&q......
  • 【算法】【线性表】最长连续序列
    1 题目给定一个未排序的整数数组num,找出最长连续序列的长度。样例1:输入:num=[100,4,200,1,3,2]输出:4解释:这个最长的连续序列是[1,2,3,4].返回所求长度42 解答publicclassSolution{/***@paramnum:Alistofintegers*@......
  • mbedTLS移植CTR_DRBG随机数算法
    一、概述因使用真随机数需要硬件支持,在硬件不支持时,我们需要通过软件来实现伪随机数生成器。根据NITSSP800-90A的推荐,推荐的随机数生成为HASH_DRBG、HMAC_DRBG、CTR_DRBG。本文主要介绍如何通过mbedtls移植实现CTR_DRBG生成随机数。二、mbedtls简要介绍MbedTLS是一个开源、......
  • 算法:如何实现大整数相加?
    算法题:给你两个很大很大的整数(如100位整数),如何求出它们的和?思路:小学数学竖式拆分,各个击破。在程序中列出的“竖式”究竟是什么样子呢?我们以426709752318+ 95481253129为例,来看看大整数相加的详细步骤:第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下......
  • [持续更新][数据结构][算法]涵盖线性表、栈、链表、队列、图、动态规划、分治递归、回
    备考考点整理内部排序表格树的主要考点二叉树的常考紧紧抓住\(n_0=n_2+1\)\(n=n_0+n_1+n_2...n_m\)\(n=n_1+2*n_2+3*n_3...m*n_m\)+1哈夫曼树没有度为1的结点,也就是\(n_1=0\)完全二叉树常考总结最大岛屿问题(dfs模板)#include<iostream>#include<algorith......
  • 【APP小程序】微信小程序包解密+加解密算法JS逆向
    简介现如今大部分微信小程序抓包看到的数据均是加密的,无法通过常规的业务抓包进行测试,现通过对微信小程序包进行解密,获取到微信小程序源码对加解密算法进行分析。微信小程序解密小程序包默认路径:C:\Users\Administrator\Documents\WeChatFiles\Applet如不知道哪个是需要测试......
  • 在自动化测试时,Python常用的几个加密算法,你有用到吗
    本文分享自华为云社区《『加密算法』|自动化测试时基于Python常用的几个加密算法实现,你有用到吗?》,作者:虫无涯。写在前边这几天做自动化测试,遇到一个问题,那就是接口的请求的密码是加密的;产品的要求是不能使用其他特殊手段,他给提供加密算法,需要在接口请求的时候,使用加密算法处......
  • 算法--哈希表
    哈希表利用空间换时间当我们要快速判断一个元素是否出现在集合里的时候,就需要考虑哈希表。哈希表一般会选择三种数据结构,分别是:数组、set(集合)、map(映射)。数组就是简单的哈希表,但是其大小不能无限开辟优先使用unordered_set(因为其查找和增删效率最优);若需要集合有序,则用set;若不......