[Leetcode 130, medium] Surrounded regions

本文介绍了一种解决二维棋盘中'O'被'X'围困问题的算法,通过将边界上的'O'替换为临时标记并递归搜索相邻'O',最终将未被标记的'O'替换为'X',实现对被围困区域的捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem:

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,

X X X X
X O O X
X X O X
X O X X

After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X

Analysis:


Solutions:

C++:

    void SearchReplace(vector<vector<char> > &board, int row, int col, char replace)
    {
        board[row][col] = replace;
        queue<pair<int, int> > visited;
        visited.push(make_pair(row, col));
        while(!visited.empty()) {
            pair<int, int> curr_pt(visited.front());
            visited.pop();
            for(int i = -1; i <= 1; ++i) {
                if(i == 0 || curr_pt.first + i < 0 || curr_pt.first + i >= board.size()
                   || board[curr_pt.first + i][curr_pt.second] != 'O')
                    continue;
                    
                board[curr_pt.first + i][curr_pt.second] = replace;
                visited.push(make_pair(curr_pt.first + i, curr_pt.second));
            }
            for(int i = -1; i <= 1; ++i) {
                if(i == 0 || curr_pt.second + i < 0 || curr_pt.second + i >= board[0].size()
                   || board[curr_pt.first][curr_pt.second + i] != 'O')
                        continue;
                        
                board[curr_pt.first][curr_pt.second + i] = replace;
                visited.push(make_pair(curr_pt.first, curr_pt.second + i));
            }
        }
    }

    void solve(vector<vector<char> > &board) 
    {
        if(board.empty())
            return;

        for(int col = 0; col < board[0].size(); ++col) {
            if(board[0][col] == 'O')
                SearchReplace(board, 0, col, 'Y');
            if(board[board.size() - 1][col] == 'O')
                SearchReplace(board, board.size() - 1, col, 'Y');
        }

        for(int row = 0; row < board.size(); ++row) {
            if(board[row][0] == 'O')
                SearchReplace(board, row, 0, 'Y');
            if(board[row][board[0].size() - 1] == 'O')
                SearchReplace(board, row, board[0].size() - 1, 'Y');
        }

        for(int row = 0; row < board.size(); ++row) {
            for(int col = 0; col < board[0].size(); ++col) {
                if(board[row][col] == 'O')
                    board[row][col] = 'X';
                else if(board[row][col] == 'Y')
                    board[row][col] = 'O';
            }
        }
    }
Java:


Python:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值