【剑斩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});
                }
            }
        }
    }
};
相关推荐
一分之二~2 小时前
回溯算法--解数独
开发语言·数据结构·c++·算法·leetcode
程芯带你刷C语言简单算法题2 小时前
Day48~对于高度为 n 的台阶,从下往上走,每一步的阶数为 1,2,3 中的一个。问要走到顶部一共有多少种走法
c语言·开发语言·学习·算法·c
休息一下接着来3 小时前
C++ 设计模式:Pimpl(Pointer to Implementation)
c++·算法·设计模式
苦藤新鸡3 小时前
18.矩阵同行同列全置零
数据结构·c++·算法·力扣
副露のmagic3 小时前
更弱智的算法学习 day48
学习·算法
汽车仪器仪表相关领域3 小时前
双组分精准快检,汽修年检利器:MEXA-324M汽车尾气测量仪项目实战全解
大数据·人工智能·功能测试·测试工具·算法·机器学习·压力测试
赫凯3 小时前
【强化学习】第六章 Dyna-Q 算法
算法
程序员-King.3 小时前
day154—回溯—分割回文串(LeetCode-131)
算法·leetcode·深度优先·回溯