IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 矩阵dfs(130. 被围绕的区域) -> 正文阅读

[C++知识库]矩阵dfs(130. 被围绕的区域)

20210904矩阵深度优先搜索

130. 被围绕的区域

board = 
[
["X","X","X","X"],
["X","O","O","X"],
["X","X","O","X"],
["X","O","X","X"]
]

输出:
[
["X","X","X","X"],
["X","X","X","X"],
["X","X","X","X"],
["X","O","X","X"]
]

就像围棋一样,如果O在边界并且与其相连的O就视为“突围”,被包围就变成X

? 难点在于如何确定O是不是连续的,那我们反其道而行之,去找不连续的“O”.用“o”表示他是不连续的。之后再进行遍历,如果为“O”那么就置为“X”,如果是“o”(不连续的)那么还原为“O”;

深度优先遍历

class Solution {

    char[][] board;

    //方向数组
    int[] dx = {1,-1,0,0};
    int[] dy = {0,0,1,-1};

    int m;
    int n;

    public void solve(char[][] board) {
        //边界条件:空矩阵的情况
        if(board==null||board.length ==0)return;
        
        //成员变量赋值
        this.m = board.length;
        this.n = board[0].length;
        this.board = board;

        //首先找到所有"O",连续的话不操作,如果不连续标记为"o",标记操作在dfs中进行

        //和围棋相同 边界上的O不会被吃掉,与边界"O"相连的不会被吃掉

        //对第一列和最后一列的O进行dfs,并且把边界相连的O标记

        for(int i=0;i < m;i++){
            dfs(i,0);
            dfs(i,n-1);
        }
        //对第一列和最后一列的所有Odfs
        for(int i=0;i < n;i++){
            dfs(0,i);
            dfs(m-1,i);
        }

        //遍历矩阵如果'o'->'O' 如果 'O'->'X'
        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(board[i][j]=='O') board[i][j]='X';

                if(board[i][j]=='o') board[i][j]='O';
            }

        }



    }

    public void dfs(int x,int y){
        //边界条件: 越界和"x"就返回;
        
        if(x<0||x >= m||y<0||y>=n||board[x][y]!='O') return;


        //如果等于O就标记
        board[x][y] = 'o';

        for(int i = 0;i<4;i++){

            dfs(x+dx[i],y+dy[i]);

        }
 
    }
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 10:37:43  更:2021-09-05 10:40:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 11:24:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码