被包围的棋子 Surrounded Regions

2023-11-07

问题: 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的区域。

首先,外围一圈上的O肯定会保留下来。然后,从外围的O能达到的O也要保留。剩下其他的O就是内部的O。

所以方法就是从外围的一圈进行DFS算法:依次对外圈的“O”做DFS,将其可以到达O临时设置为#。

特殊用例:只有外围轮廓没有内部。比如长或者宽小于2,此时不存在被包围的'X'。

class Solution {
public:
    void solve(vector<vector<char>> &board) {
        int row = board.size();
        if(row < 2)
            return;
        int col = board[0].size();
        if(col < 2)
            return;
        
        //从最外面的一圈进行dfs
        //top一行
        for(int i=0;i<col;i++)
        {
            if(board[0][i] == 'O')
            {
                board[0][i] = '#';
                dfs(board, 0, i, row, col);
            }
        }
        // bottom一行
        for(int i=0;i<col;i++)
        {
            if(board[row-1][i] == 'O')
            {
                board[row-1][i] = '#';
                dfs(board, row-1, i, row, col);
            }
        }
        //left一列
        for(int i=1;i<row-1;i++)
        {
            if(board[i][0] == 'O')
            {
                board[i][0] = '#';
                dfs(board, i, 0, row, col);
            }
        }
        // right一列
        for(int i=1;i<row-1;i++)
        {
            if(board[i][col-1] == 'O')
            {
                board[i][col-1] = '#';
                dfs(board, i, col-1, row, col);
            }
        }
        
        //将'O'变为'X',将'#'恢复回'O'
        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
            {
                if(board[i][j] == 'O')
                    board[i][j] = 'X';
                else if(board[i][j] == '#')
                    board[i][j] = 'O';
            }
    }
    
    void dfs(vector<vector<char>> &board, int i, int j, int row, int col)
    {
        if(i > 1 && board[i-1][j] == 'O')
        {
            board[i-1][j] = '#';
            dfs(board, i-1, j, row, col);
        }
        if(i < row-1 && board[i+1][j] == 'O')
        {
            board[i+1][j] = '#';
            dfs(board, i+1, j, row, col);
        }
        if(j > 1 && board[i][j-1] == 'O')
        {
            board[i][j-1] = '#';
            dfs(board, i, j-1, row, col);
        }
        if(j < col-1 && board[i][j+1] == 'O')
        {
            board[i][j+1] = '#';
            dfs(board, i, j+1, row, col);
        }
    }
};



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

被包围的棋子 Surrounded Regions 的相关文章

随机推荐

  • 3.2 回溯法—N皇后问题

    1 问题描述 在 n n n times n n n的棋盘上摆放 n n n个皇后 使任意两个皇后都不能处于同一行 同一列或同一斜线上 2 问题
  • uniapp 跳转支付宝支付

    saId 作用 20000123 支付宝收款码 10000007 支付宝扫一扫 let authUrl alipays platformapi startapp saId 10000007 qrcode decodeURI res code
  • 华为机试 放苹果

    题解 动态规划 采用dp i j 表示 i个苹果放入j个盘子的不同分法数 状态转移 我们首先要明确一点 j个苹果放入i个盘中中 总共有下列两种情况 盘子全部放满 至少有一个盘子不放 为空 一 当i gt j 时 也就是苹果数多于盘子数时 1
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • 代码编辑神器--VSCode之插件

    代码编辑神器 VSCode之插件 Visual Studio Code 简称VS Code 是一个由微软开发 同时支持Windows Linux 和 macOS 等操作系统的免费代码编辑器 在2019年的Stack Overflow组织的开
  • MySQL引擎

    MyISAM存储引擎 MyIsam 的存储文件有三个 后缀名分别是 frm MYD MYI 其中 frm 是表的定义文件 MYD 是数据文件 MYI 是索引文件 MyIsam 只支持表锁 不支持事务 MyIsam 由于有单独的索引文件 在读
  • STM32单片机初学5-IIC通信驱动OLED屏幕

    在我上篇文章 STM32 软件模拟IIC通信 讲解了软件模拟IIC通信 这篇文章详将细讲解利用软件模拟IIC来控制0 96寸的OLED屏幕 如下图 使其显示字符串 本文将不再对IIC通信原理做详细讲解 所以对IIC通信原理不熟悉的话可以参考
  • NAT技术和代理服务器

    NAT NAT是地址转换协议 将内网地址转换为公网地址 简单的说 NAT就是在局域网内部网络中使用内部地址 而当内部节点要与外部网络进行通讯时 就在网关处 将内部地址替换成公用地址 从而在外部公网 internet 上正常使用 NAT可以使
  • Nginx配置静态资源文件403 没权限及404 Not Found问题解决方法

    Nginx配置静态资源文件403 没权限及404 Not Found问题解决方法 修改配置文件nginx conf 静态文件报错403配置 文件最上方 user nobody改为 user root owner 404错误配置 nginx配
  • Shell脚本——流量探测(自动化运维)

    目的 自动 捕获指定IP或端口的流量生成日志 实现流量探测功能 准备 Root用户权限下才能运行tcpdump脚本 优势 Liunx系统自带 无需安装其他组件 捕获准确度高 缺点 不能同时检测多个IP流量 效率低 重点 日志文件 touch
  • 【报错记录】解决华擎J3455-ITX不插显示器无法开机的问题

    我的J3455 ITX主要当作下载机使用 对付那个速度奇慢的百度云 速度任它慢 我7 24小时不停的下 总能下完 然后又嵌套了一个CentOS7的虚拟机 用于作为GitLab代码服务器使用 可以说是一举多得 但是最近发现这台经常掉线 远程桌
  • idea集成visualvm插件 以及添加visual GC插件 - 监控程序

    安装VisualVM插件 1 插件安装 setting gt Plugings gt VisualVM launcher gt Search in repositories gt install gt Restart IDEA 安装完成之后
  • Java——Intellij IDEA出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver处理办法

    Intellij IDEA出现 Exception in thread main java lang ClassNotFoundException com mysql jdbc 处理办法 解决方法 File gt project struc
  • git修改提交记录的邮箱

    前言 旧仓库迁移到新的git仓库 而新仓库开启了规则 检查 Git 提交的提交者 Committer 和提交作者 Author 必须是已验证的邮箱 于是 旧的代码仓库无法整库迁移 提交时提示 remote 提交 52954f93882138
  • vue 循环input获取值

    html代码 循环input v model绑定
  • c语言中的语义错误和语法错误,C语言程序中对错误的调试

    程序调试 现在我们已经可以编写一个简单的 C语言程序了 但是你可能会犯一些简单的错误 程序的错误通常叫做 bug 而发现和修正这些错误的过程叫做调试 下面有一个带有一些错误的程序 看看你能找出多少 语法错误 上面的程序中包含了几个语法错误
  • linux grep 使用

    1 grep 单独使用 搜素指定目录中包含指定字符的文件 例如 grep r words 搜素当前目录中包含 words 字符的文件 grep r words wc 搜素当前目录中包含 words 字符的文件 只显示 包含该字符的数量 2
  • gre 填空78-89

    section 78 median 1 Kinetic dynamic energizing Immutable not capable of or susceptible to change 2 It is often argued th
  • idea build 报错,maven install 正常运行

    pom中引的包 代码写的时候也有提示 写完也不报错 build 或者 run 或者 debug 启动就报错 提示程序包xxx无法找到 原来是idea 自身的问题 首先执行maven 命令 mvn idea idea 再点击idea的菜单fi
  • 被包围的棋子 Surrounded Regions

    问题 Given a 2D board containing X and O capture all regions surrounded by X A region is captured by flipping all O s into