【剑斩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 小时前
Plücker直线_ 用两个三维向量描述一条空间直线
线性代数·算法·直线·几何表示
小道士写程序6 小时前
Rust 中的字符串与切片(String 与 &str)
算法
圣保罗的大教堂6 小时前
leetcode 3863. 将一个字符串排序的最小操作次数 中等
leetcode
Tisfy6 小时前
LeetCode 3863.将一个字符串排序的最小操作次数:分类讨论(一次遍历)——简单易懂版
算法·leetcode·字符串·题解·分类讨论
Young Doro7 小时前
从平衡表征到最小充分因果表征:端到端神经网络因果效应估计
算法
0+1117 小时前
算法 --递归
算法·leetcode
打工仔折腾 AI7 小时前
介入式脑机接口的跨尺度解码与闭环调控:从算法落地到后端工程实践
人工智能·后端·python·深度学习·算法·ai agent 实战
凤山老林7 小时前
授权模型只会RBAC?深入 ABAC 授权模型,实现权限判断做成策略引擎
大数据·数据库·算法
海绵宝宝转agent8 小时前
2026-10-21学习笔记
笔记·学习·算法
Dxy12393102168 小时前
ShardingSphere 自定义分片算法:BINARY(16) UUIDv7 哈希分片实现
算法·哈希算法