首页 > 其他分享 >填涂颜色(BFS)

填涂颜色(BFS)

时间:2024-11-21 20:17:54浏览次数:3  
标签:填涂 颜色 边界 int 矩阵 BFS vector &&

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

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

int main(){
    int n;
    cin>>n;
    queue<pair<int,int>> q;
    vector<vector<int>> v(n+2,vector<int>(n+2));// 初始化矩阵,增加边界,实际大小为 (n+2) x (n+2)
    for(int i=1;i<=n;i++){  // 输入矩阵内容,从 (1,1) 到 (n,n),避开边界
        for(int j=1;j<=n;j++){
            cin>>v[i][j];
        }
    }
    q.push({0,0});// 将左上角外部的初始点 (0,0) 推入队列,并标记为访问过(-1)
    v[0][0] = -1;
    while(q.size()){
        auto [x,y] = q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx >= 0 && nx <= n+1 && ny >= 0 && ny <= n+1 && v[nx][ny]==0){
                v[nx][ny]=-1;
                q.push({nx,ny});
            }
        }
    }
    
    for(int i=1;i<=n;i++){// 遍历矩阵,将未被标记为边界连通的 0 替换为 2
        for(int j=1;j<=n;j++){
            if(v[i][j] == 0){
                v[i][j] = 2;
            }
        }
    }
    for(int i=1;i<=n;i++){// 输出最终矩阵,恢复边界连通区域的标记为 0
        for(int j=1;j<=n;j++){
            if(v[i][j] == -1){
                v[i][j] = 0;
            }
            cout<<v[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}
    

通过在原矩阵的四周加上一圈额外的边界,扩展后的矩阵为 (n+2) x (n+2),BFS 处理将与边界连通的所有 0 标记为 -1,表示这些 0 已经被访问过且是边界连通的。

经过 BFS 处理后,剩余的 0 就是闭合区域的 0。将剩下的 0 填充为 2,即为闭合区域。

最后再将-1恢复成0输出填充后的矩阵

标签:填涂,颜色,边界,int,矩阵,BFS,vector,&&
From: https://blog.csdn.net/Ct314/article/details/143894938

相关文章

  • 可视化CSS3渐变背景颜色代码生成插件
    在线预览 特效下载 这是一款可以在线生成CSS3渐变背景颜色代码的可视化插件。你可以通过调节界面上给出的颜色、色相、饱和度和亮度滑块,以及渐变方向滑块来生成各种线性渐变,屏幕上会给出相应的CSS3线性渐变代码。该渐变背景颜色插件可以设置的选项有:BaseColor:Hue:色相......
  • threejs根据接口状态更换物体颜色
    问题需求是根据接口返回的状态来修改物体A的颜色,但在实际操作中,发现物体A颜色成功修改,但物体B的颜色也变了,代码如下letmodel=XXX;//导入的物体object.sceneconstchangePumpColor=()=>{constnameNode=model.getObjectByName('xxx');setObject3DColor(nameN......
  • 1021 Deepest Root(树的直径、bfs/dfs、并查集)
     先通过并查集判断有几个连通图,如果只有一张图,那就用两次dfs/bfs来找到树的直径上的所有端点1#include<bits/stdc++.h>2usingnamespacestd;3intn;4vector<int>edges[10005];5boolvisited[10005]={false};6set<int>temp;//记录该次dfs筛选出树直径......
  • Qt 16进制颜色 QColor
    一、16进制转rgb(a)1、QColor类可以通过字符串作为参数来创建表示RGBA值的颜色对象。字符串必须满足以下格式,RGB(红、绿、蓝):#RRGGBB或者#RGB,其中RR、GG、BB表示16进制的红、绿、蓝分量的值。RGBA(红、绿、蓝、透明度):#RRGGBBAA或者#RGBA,其中RR、GG、BB表示16......
  • BFS 算法专题(三):BFS 解决边权为 1 的最短路问题
    目录1.迷宫中离入口最近的出口 1.1算法原理1.2算法代码2.最小基因变化★★★2.1算法原理2.2算法代码3.单词接龙3.1算法原理3.2算法代码4.为高尔夫比赛砍树(hard)4.1算法原理 4.2算法代码1.迷宫中离入口最近的出口 .-力扣(LeetCode)1.1算......
  • opencv的RGB 颜色表
    转载:https://blog.csdn.net/Vertira/article/details/122477160RGB(255,23,140)是光的三原色,也即是红绿蓝Red,Green,Blue,它们的最大值是255,相当于100%。白色:rgb(255,255,255)黑色:rgb(0,0,0)红色:rgb(255,0,0)绿色:rgb(0,255,0)蓝色:rgb(0,0,255)青色:rgb(0,255,255)紫色:rgb(255,0,......
  • BFS 算法专题(二):BFS 解决 FloodFill 算法
    目录1.图像渲染1.1算法原理1.2算法代码2.岛屿数量2.1算法原理2.2算法代码3.岛屿的最大面积3.1算法原理3.2算法代码4.被围绕的区域4.1算法原理4.2算法代码1.图像渲染.-力扣(LeetCode)1.1算法原理在本专题之前,对于FloodFill算法,我们就已......
  • 迪杰斯特拉算法、弗洛伊德算法和BFS(广度优先搜索)
    迪杰斯特拉算法、弗洛伊德算法和BFS(广度优先搜索)都是用于求解最短路径问题的经典算法,它们各自有不同的特点和适用场景。以下是对这三种算法的介绍、区别以及代码实现的简要概述。迪杰斯特拉算法(Dijkstra'salgorithm)介绍:迪杰斯特拉算法是一种单源最短路径算法,用于计算一个......
  • 每日OJ题_牛客_kotori和迷宫_BFS_C++_Java
    目录牛客_kotori和迷宫_BFS题目解析C++代码Java代码牛客_kotori和迷宫_BFSkotori和迷宫描述:        kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她......
  • 让CMYK印刷颜色变干净的方法
    CMYK颜色灰怎么办?一个操作让颜色变干净!在CMYK色彩模式中,C(青色)、M(洋红)、Y(黄色)、K(黑色)的组合如果出现问题,就容易导致颜色发灰。其中一个主要原因是黑色(K)的过度使用或者不恰当使用。当K值过高时,容易使颜色暗淡发灰。另外,CMY三色的平衡失调,例如在印刷过程中或者在软件调色过程......