【剑斩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});
                }
            }
        }
    }
};
相关推荐
♡すぎ♡14 分钟前
ShaderLab:PBR+IBL(ShaderToy Translation)
算法·计算机图形学·着色器·pbr·ibl
AI周红伟15 分钟前
创业10年,张一鸣成长的2个基本方法论
面试·职场和发展
Shadow(⊙o⊙)16 分钟前
前缀和:和可被K整除的子数组(normal)
数据结构·c++·算法
世纪末的小黑20 分钟前
【LeetCode自用】LeetCode自用记录贴,题目一:两数之和
数据结构·算法·leetcode
兰令水20 分钟前
topcode【随机算法题】【2026.5.22打卡-java版本】
java·算法·leetcode
Brilliantwxx29 分钟前
【C++】 认识STL set与map(基础接口+题目OJ运用)
开发语言·数据结构·c++·笔记·算法
05候补工程师31 分钟前
【线性代数】核心考点复习笔记:二次型配方法、施密特正交化步骤与特征值经典题型详解
经验分享·笔记·线性代数·考研·算法
Deep-w34 分钟前
【MATLAB】基于遗传算法的直流电机 PI 控制器参数优化研究
开发语言·算法·matlab
暴力求解39 分钟前
数据结构---二叉树及堆的实现
数据结构·算法·二叉树
超梦dasgg1 小时前
并查集(Union-Find)详解 + Java 完整实现
java·数据结构·算法·图搜索