当前位置: 首页 > news >正文

LeetCode: Surrounded Regions [130]

【题目】

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

X X X X
X O O X
X X O X
X O X X

After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X


【题意】

给定一个二维矩阵,由'X'和'O'填充,本题要求把那些被'X'包围的'O'替换为'X'。注意这里的包围是指四周全然包围。

假设某片'O'区域触及了矩阵的边界。则这片区域就不算被'X'包围。


【思路】

    我们仅仅须要先把触及到边界的'O'区域所有替换成还有一个字母, 比方'M'。矩阵中剩下的'O'区域就肯定是被包围的了。


    然后,我们扫描矩阵把'O'替换成'X', 把'M'替换回'O'就可以
    
    区域的遍历,使用DFS或BFS
    DFS要使用递归,当矩阵非常大的时候easy超时
    所以本题使用BFS

    


【代码】

class Solution {
public:

    void O2M(vector<vector<char> >&board, int i, int j){
        //从board[i][j]開始。遍历'O'区域,把'O'替换成'M'
        int rows=board.size();
        int cols=board[0].size();
        queue<int> qe;
        qe.push(i*cols+j);
        board[i][j]='M';
        while(!qe.empty()){
            int pos = qe.front(); qe.pop();
            i=pos/cols;
            j=pos%cols;
            //推断上方
            if(i-1>=0 && board[i-1][j]=='O'){
                board[i-1][j]='M';  //注意在将相邻元素填到队列中时,须要将它标记为以訪问,否则以后在确定其它节点的'O'相邻位置时,非常有可能又把这个节点增加到队列中。造成死循环。
                qe.push((i-1)*cols + j);
            }
            //推断下方
            if(i+1<rows && board[i+1][j]=='O'){
                board[i+1][j]='M';
                qe.push((i+1)*cols + j);
            }
            //推断左方
            if(j-1>=0 && board[i][j-1]=='O'){
                board[i][j-1]='M';
                qe.push(i*cols + j-1);
            }
            //推断右方
            if(j+1<cols && board[i][j+1]=='O'){
                board[i][j+1]='M';
                qe.push(i*cols + j+1);
            }
        }
    }

    void solve(vector<vector<char>> &board) {
        int rows=board.size();
        if(rows==0)return;
        int cols=board[0].size();
        if(cols==0)return;
        
        //把临边的'O'区域替换成'M'
        //上边
        for(int j=0; j<cols; j++){
            if(board[0][j]=='O')O2M(board, 0, j);
        }
        //下边
        for(int j=0; j<cols; j++){
            if(board[rows-1][j]=='O')O2M(board, rows-1, j);
        }
        //左边
        for(int i=0; i<rows; i++){
            if(board[i][0]=='O')O2M(board, i, 0);
        }
        //右边
        for(int i=0; i<rows; i++){
            if(board[i][cols-1]=='O')O2M(board, i, cols-1);
        }
        
        //扫描矩阵。把O替换成X, 把M替换成O
        for(int i=0; i<rows; i++){
            for(int j=0; j<cols; j++){
                if(board[i][j]=='O')board[i][j]='X';
                else if(board[i][j]=='M')board[i][j]='O';
            }
        }
        
    }
};


转载于:https://www.cnblogs.com/blfshiye/p/5150808.html

相关文章:

  • 常用中文字体
  • 2016 - 1 - 23 json转模型 常用的第三方框架
  • 常用英文字体收集备用
  • 80后的我,碌碌无为的22年
  • MongoDb的安装
  • 读书笔记 - 《格鲁夫给经理人的第一课》
  • 用Delphi制作DLL的方法
  • poj 2769 Reduced ID Numbers(memset使用技巧)
  • 2010 - 2011
  • CSS实现强制换行-------Day 78
  • Machine Learning #Lab1# Linear Regression
  • DirectDraw7的INITGUID问题
  • HDU 1326
  • 桌面宠物大全
  • 前端学习路线整理
  • [NodeJS] 关于Buffer
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • echarts的各种常用效果展示
  • ECS应用管理最佳实践
  • Electron入门介绍
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • ES6系列(二)变量的解构赋值
  • Gradle 5.0 正式版发布
  • JS题目及答案整理
  • SpringBoot几种定时任务的实现方式
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 我的zsh配置, 2019最新方案
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 写代码的正确姿势
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • Java数据解析之JSON
  • mysql面试题分组并合并列
  • 正则表达式-基础知识Review
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #define用法
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)springcloud实战之config配置中心
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十六)Flask之蓝图
  • (转)编辑寄语:因为爱心,所以美丽
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET/C# 使用反射注册事件
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET上SQLite的连接
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /etc/shadow字段详解
  • @GetMapping和@RequestMapping的区别
  • @Responsebody与@RequestBody
  • [1525]字符统计2 (哈希)SDUT