Flood Fill模型

news2024/9/28 21:16:25

这个模型主要用来求连通块的数量,在求连通块时有“8连通”和“4连通”之分。

看上面的图形,如果是4连通那么红色和绿色就不连通(只有一个格子的“上下左右”相连才叫连通)。如果是8连通那就联通(不仅仅包含边相连,共顶点也叫连通)。

1097. 池塘计数 - AcWing题库

#include<iostream>
#include<utility>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
queue<PII> q;
const int N = 1010;
char g[N][N];
bool st[N][N];
int dx[8] = {-1,-1,0,1,1,1,0,-1};
int dy[8] = {0,1,1,1,0,-1,-1,-1};
int n,m,tmp=0;
void bfs(int sx,int sy){                               //BFS模板
    PII p = make_pair(sx,sy);
    q.push(p);
    st[sx][sy] = true;                                //首先,起点入队
    while(!q.empty()){                                //只要队列不空
        PII v = q.front();
        q.pop();
        int ax = v.first;
        int ay = v.second;
        for(int i=0;i<8;i++){                         //遍历与此时这个点相邻的点
            int nx = ax+dx[i];
            int ny = ay+dy[i];
            if(st[nx][ny]) continue;
            if(nx <1 || nx >n || ny <1 || ny >m) continue;
            if(g[nx][ny]=='.') continue;
            q.push(make_pair(nx,ny));                 //入队
            st[nx][ny] = true;                        //改变状态
        }
        
    }
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
    }
    

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(g[i][j]=='W' && !st[i][j]){
                bfs(i,j);
                tmp++;
            }
        }
    }
    
    cout<<tmp;
}

接下来讲一下一个比较难的题目(难在图的表示):
 

  1   2   3   4   5   6   7  
   #############################
 1 #   |   #   |   #   |   |   #
   #####---#####---#---#####---#
 2 #   #   |   #   #   #   #   #
   #---#####---#####---#####---#
 3 #   |   |   #   #   #   #   #
   #---#########---#####---#---#
 4 #   #   |   |   |   |   #   #
   #############################
           (图 1)

   #  = Wall   
   |  = No wall
   -  = No wall

   方向:上北下南左西右东。

图1是一个城堡的地形图。

请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。

城堡被分割成 nm个方格区域,每个方格区域可以有0~4面墙。

注意:墙体厚度忽略不计。

第一行包含两个整数 m 和 n,分别表示城堡南北方向的长度和东西方向的长度。

接下来 m 行,每行包含 n 个整数,每个整数都表示平面图对应位置的方块的墙的特征。

每个方块中墙的特征由数字 P 来描述,我们用1表示西墙,2表示北墙,4表示东墙,8表示南墙,PP 为该方块包含墙的数字之和。

例如,如果一个方块的 P 为3,则 3 = 1 + 2,该方块包含西墙和北墙。

城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。

输入的数据保证城堡至少有两个房间。

注意,这里面(1表示西墙,2表示北墙,4表示东墙,8表示南墙

注意:我们得到的P是这些数字加起来的,因此,我们如果想看下一个位置通不通,只需要取相应位置的二进制数就可以了。比如:

现在一个方格的P是3(既1+2)我想看他的北面有没有墙。我们首先给这四个方向编一个号(西:0,北:1,东:2,南:3。这里可以用循环遍历四个方向!!)我们用P>>1,这是将P右移1位,这样原来的(3既0011)就变成001了然后我们再&1这样就可以得到最低位是0还是1了。

#include<iostream>
#include<queue>
#include<algorithm>
#include<utility>
using namespace std;
typedef pair<int,int> PII;
const int N = 55;
queue<PII> q;
int n,m,cnt,mara;
int g[N][N];
bool st[N][N];

int dx[] = {0,-1,0,1};
int dy[] = {-1,0,1,0};

int bfs(int sx,int sy){
    q.push(make_pair(sx,sy));
    st[sx][sy] = true;
    int tem=1;//起点也算一个房间
    while(!q.empty()){
        PII p = q.front();
        q.pop();
        for(int i = 0; i<4 ;i++){
            int nx = p.first + dx[i];
            int ny = p.second + dy[i];
            if(!st[nx][ny] && nx>=1 && nx<=n && ny>=1 && ny<=m && !(g[p.first][p.second]>>i&1)){//注意这里g[][]测试的是基点,而不是要遍历的点
                q.push(make_pair(nx,ny));
                st[nx][ny] = true;
                tem++;
            }
        }

    }
    return tem;
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
    }


    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!st[i][j]){
                mara = max(bfs(i,j),mara);
                cnt++;
            }
        }
    }

    cout<<cnt<<endl<<mara;


    return 0;
}

1106. 山峰和山谷 - AcWing题库

#include<iostream>
#include<utility>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1010;
typedef pair<int,int> PII;
int g[N][N];
bool st[N][N];
int n,ah,al;
int dx[] = {-1,-1,0,1,1,1,0,-1};
int dy[] = {0,1,1,1,0,-1,-1,-1};


void bfs(int sx,int sy,bool &hashigher,bool &haslower){
    queue<PII> q;
    q.push(make_pair(sx,sy));
    st[sx][sy] = true;
    while(!q.empty()){
        PII p = q.front();
        q.pop();
        for(int i=0;i<8;i++){
            int nx = p.first + dx[i];
            int ny = p.second + dy[i];
            if(nx <1 || nx >n || ny <1 ||ny >n) continue;//超过界限的忽略
            if(g[p.first][p.second]==g[nx][ny]){         //其周围的格子值,要么相等,要么不相等
                if(!st[nx][ny]){                         //没有被访问过,才能进行入队
                    q.push(make_pair(nx,ny));
                    st[nx][ny] = true;
                }else continue;
            }
            else{                                        //格子值不相等
                if(g[p.first][p.second] < g[nx][ny]) hashigher=true;  //至少存在一个比这个高的。
                else haslower=true;     //至少存在一个比这个小的。
            }
        }
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>g[i][j];
        }
    }
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!st[i][j]){
                bool hashigher=false,haslower=false;
                bfs(i,j,hashigher,haslower);
                if(hashigher && haslower)  continue;//既有比它高的也有比它小的。
                if(!hashigher) ah++;    //如果没有比这个高的。那么这个最高。
                if(!haslower)  al++;    //如果没有比这个小的,那么这个最小。
                
            }
        }
    }
    
    cout<<ah<<" "<<al<<endl;
    
    
    
    return 0;
}

这个BFS设计的很灵活,从中可以理解到:如何进行BFS?关键步骤就是哪些入队列,哪些不入队列。这个题很巧妙,只有相等的才入队列,并将其状态设置位true。其他的不入队列,因此没有必要设置为true(如果设置了,反而会发生错误,导致后面遍历地图时自动略过这个点)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2174784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SwiftUI简明概念(4):如何对shape同时进行fill和stroke

1、iOS17方案 iOS17上可以同时对shape调用fill和stroke&#xff1a; Circle().stroke(.red, lineWidth: 20).fill(.orange).frame(width: 150, height: 150) 效果也如我们所预料的&#xff1a; 而且stroke可以调用任意次&#xff1a; Circle().stroke(.blue, lineWidth: 45…

【路径规划】基于球向量的粒子群优化(SPSO)算法在无人机路径规划中的实现

摘要 本文介绍了基于球形矢量的粒子群优化&#xff08;Spherical Particle Swarm Optimization, SPSO&#xff09;算法&#xff0c;用于无人机&#xff08;UAV&#xff09;路径规划。SPSO算法通过引入球形矢量的概念&#xff0c;增强了粒子群在多维空间中的探索和利用能力&…

TXT文档批量处理,根据总行数平均分成多个文件保存,批量拆分实例分享

在高强度的工作下&#xff0c;怎样拆分文档&#xff0c;手动拆分整理&#xff0c;不仅效率低&#xff0c;而且还容易出错。当然是要选择操作轻松简单首助编辑高手&#xff0c;提高工作效率。 1、打开软件并选择到文本批量操作功能选项上&#xff0c;选择文本批量操作&#xff1…

【C++】类和对象(类的定义,类域,实例化,this指针)

目录 一. 类的定义 【对比c】结构体和类的区别 1. 称呼&#xff1a;变量 or 对象&#xff1f; 2. 类型&#xff1a; 3. 访问限定&#xff1a; 4. c和c结构体使用 5. 相同点&#xff1a; 二. 类域 三. 实例化 1. 1对N 2. 计算大小只考虑成员变量 3. 到此一游 四. …

一、前后端分离及drf的概念

1.1什么是前后端分离 程序角度 前后端不分离&#xff1a;一个程序&#xff08;如django),接收请求处理HTML模版用户返回 前后端分离&#xff1a;两个程序 --前端&#xff1a;vue.js/react.js/angular.js --后端&#xff1a;Django drf(django rest framework) 2.专业角度 --…

3.消息机制总结——总结

Handler 机制的底层逻辑就是利用 epoll eventfdAndroid2.3开始 Google把Handler的阻塞/唤醒方案从Object#wait()/notify(),改为Linux epoll实现&#xff0c;why&#xff1f;原因在于&#xff0c;native也引入了消息管理机制&#xff0c;用于提供个C/C开发者使用&#xff0c;而…

nicegui组件button用法深度解读,源代码IDE运行和调试通过

传奇开心果微博文系列 前言一、button 组件基本用法1. 最基本用法示例2. 创建带图标按钮 二、button按钮组件样式定制1. 按钮的尺寸调整2. 改变颜色示例3. 按钮的自定义字体大小4. 圆角形状示例5. 自定义边框6. 添加阴影7. 复合按钮8. 浮动按钮9. 可扩展浮动操作按钮QFAB10. 按…

使用k8s部署java前后端服务

一、项目架构 前端、后端、数据库 1&#xff09;前端 静态的资源&#xff1a;img css html js文件 js&#xff1a;axios、ajax 2&#xff09;后端 提供数据&#xff1a;根据web前端发送的请求&#xff0c;从数据库中获取数据 请求都是无状态的&#xff0c;如何保持会话 …

依赖注入之set注入

set注入 set注入&#xff0c;基于set王法实现的&#xff0c;底层通过反射机制调用属性对应的set方法&#xff0c;然后给属性赋值&#xff0c;这种方法要求属性必须对外提供set方法 1. 想让Spring调用对应的set方法&#xff0c;需要配置property标签 2. name属性怎么指定值:s…

【含文档】基于Springboot+微信小程序 的高中信息技术课程在线测试系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 当游客…

解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

CentOS系统yum出现Could not retrieve mirrorlist问题

问题 yum search wget当使用yum命令来搜索或安装软件时&#xff0c;如果出现Could not retrieve mirrorlist&#xff0c;即无法检索镜像列表。出现的问题截图如下&#xff1a; 解决方法&#xff1a; 跳转到root用户 su - rootcd到/etc/yum.repos.d/目录下 cd /etc/yum.rep…

异步框架 fastapi -- 简单介绍

文章目录 fastapi 介绍restful接口设计简单应用Swagger风格的接口文档 fastapi 介绍 fastapi官方文档 fastapi 是现代化、高性能、基于python标准类型注释的异步web框架&#xff1b;基于python构建web APIs&#xff0c;性能可比go语言&#xff1b;高效编码&#xff0c;更少的…

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …

攻防世界---->happyctf

做题笔记。 下载 查壳。 32ida打开。 先运行一下&#xff1a; C写的。 追踪 good job 具体跟踪分析&#xff1a; 说白了&#xff0c;就是一个用于判断 flag key的。 往上走&#xff1a; 跟进。 打开 od吧。 锁定地址 追踪看看。&#xff08;此题&#xff0c;ida不能动态 od可以…

Hugging Face从命令行到桌面:Chat-macOS让AI互动更简单,关键还免费!

你是否曾经觉得,命令行操作虽然强大,但总是有些难以上手?或者,你是否希望和AI互动可以像日常使用macOS应用一样直观?那你一定要试试Chat-macOS,它让你从命令行走向桌面,体验更轻松的AI互动方式。 1. 什么是Chat-macOS? Chat-macOS是一个桌面应用程序,它能够将Hug…

Windows安全日志7关键事件ID分析

背景 Windows日志里的事件分析有助于在系统出现异常时分析出异常原因&#xff0c;利于针对问题做出系统的修复和预防。今天阿祥就整理出Windows常见的事件&#xff0c;分析这些事件的具体原因&#xff0c;希望对系统运维工程师们有一定的帮助&#xff01; 具体事件ID 1、事件ID…

MySQL—触发器详解

基本介绍 触发器是与表有关的数据库对象&#xff0c;在 INSERT、UPDATE、DELETE 操作之前或之后触发并执行触发器中定义的 SQL 语句。 触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作。 使用别名 NEW 和 OLD 来引用触发器中发生变化的记…

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

fiddler抓包12_篡改请求(请求前断点)

课程大纲 原理 正常“客户端-服务器”通信&#xff0c;即发送请求&#xff0c;接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时&#xff0c;请求和响应都会从Fiddler通过&#xff0c;Fiddler可以捕获并展示。 请求前断点&#xff08;BreakPoint Before Request&#xff0…