【剑斩OFFER】算法的暴力美学——力扣 130 题:被围绕的区域

一、题目描述

二、算法原理

1)处理边缘 'O',防止干扰微软 'O' :

2)使用层序遍历查找中间的使用的 'O' 并且让他变成 '1':

https://blog.csdn.net/2403_84958571/article/details/157102889?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

3)在查找围绕'0',之后最后再把 '1' 变成 'O'

三、代码实现

cpp 复制代码
class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    typedef pair<int,int> PII;
public:
    void solve(vector<vector<char>>& board) {
        
        for(int i = 0; i < board.size();i++)//处理 第 1 行 和 最后 1 行的边界情况,边界 'O' = '1',防止干扰围绕的 'O'
        {
            if(i == 0 || i == board.size() - 1)
            {
                for(int k = 0; k <board[0].size(); k++)
                {
                    if(board[i][k] == 'O')
                    {
                        board[i][k] = '1';
                        become(board,i,k);
                    }
                }
            }
        }

        for(int i = 1; i < board.size() - 1; i++)//处理中间行的边界情况,边界 'O' = '1'
        {
            for(int k = 0; k < board[0].size();k++)
            {
                if(k == 0 || k == board[0].size() - 1)
                {
                    if(board[i][k] == 'O')
                    {
                        board[i][k] = '1';
                        become(board,i,k);
                    }
                }
            }
        }

        for(int i = 0; i < board.size(); i++)//查找中间 'O'
        {
            for(int k = 0; k < board[0].size(); k++)
            {
                if(board[i][k] == 'O')
                {
                    board[i][k] = 'X';
                    CheckBoard(board,i,k);
                }
                if(board[i][k] == '1')//还原 '1' = 'O'
                {
                    board[i][k] = 'O';
                }
            }
        }
    }

    void CheckBoard(vector<vector<char>>& board,int i,int k)
    {
        queue<PII> que;
        que.push({i,k});
        while(que.size())
        {
            auto [x,y] = que.front();
            que.pop();
            for(int a = 0; a < 4; a++)
            {
                int new_x = x + dx[a];
                int new_y = y + dy[a];
                if(new_x >= 0 && new_x < board.size() && new_y >= 0 && new_y < board[0].size() && board[new_x][new_y] == 'O')
                {
                    board[new_x][new_y] = 'X';
                    que.push({new_x,new_y});
                }
            }
        }
    }

    void become(vector<vector<char>>& board,int i,int k)
    {
        queue<PII> que;
        que.push({i,k});
        while(que.size())
        {
            auto [x,y] = que.front();
            que.pop();
            for(int a = 0; a < 4; a++)
            {
                int new_x = x + dx[a];
                int new_y = y + dy[a];
                if(new_x >= 0 && new_x < board.size() && new_y >= 0 && new_y < board[0].size() && board[new_x][new_y] == 'O')
                {
                    board[new_x][new_y] = '1';
                    que.push({new_x,new_y});
                }
            }
        }
    }
};
相关推荐
徐小夕6 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
可编程芯片开发7 小时前
UPFC统一潮流控制器的simulink建模与仿真
算法
小小仙子8 小时前
矢量网络分析仪如何测试S参数的?
人工智能·算法·机器学习
中微极客9 小时前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek10 小时前
前缀和实现Kogge-Stone算法
数据结构·算法
元Y亨H10 小时前
开发者必须掌握的十大核心算法
算法
元Y亨H10 小时前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法
元Y亨H10 小时前
数据结构与算法的通俗指南
数据结构·算法
2301_7644413311 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模