包围的区域不适用于更大的输入

Surrounded Regions not working for larger input

本文关键字:输入 不适用 区域 包围 适用于      更新时间:2023-10-16

我无法让我的代码解决这个问题,也不确定如何找出原因。它在小集合上工作,但在大集合上失败。

给定一个包含"X"和"O"的 2D 板,捕获"X"包围的所有区域。

通过在周围区域将所有"O"翻转为"X"来捕获区域。

例如

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

运行函数后,开发板应为:

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

我的解决方案:

class Solution {
public:
    void solve(vector<vector<char>> &board) {
        int row = board.size();
        if (row<=1) return;
        int col = board[0].size();
        if (col<=1) return;
        for (int c=0; c<col; c=c+col-1)
        for (int r=0; r<row; r++)
         {
             if (board[r][c]=='O')
                findBdCoords(board,r, c, row, col);
         }
        for (int r=0; r<row; r=r+row-1)
        for (int c=0; c<col; c++)
        {
             if (board[r][c]=='O')
                findBdCoords(board,r, c, row, col);            
        }
        for (int r=0; r<row; r++)
        for (int c=0; c<col; c++)
        {
             if (board[r][c]=='O')
                   board[r][c]='x';
             if (board[r][c]=='B')
                 board[r][c]='O';
        }       
    }
    void findBdCoords(vector<vector<char>> &board, int r, int c, int row, int col)
    {
        if (board[r][c]!='B')
            board[r][c]='B';
              //4 directions neighbor
                        //4 directions neighbor
            if (r + 1 < row && board[r + 1][c]=='O')
                findBdCoords(board, r + 1, c,  row, col);
            if (r - 1 >= 0&& board[r - 1][c]=='O')
                findBdCoords(board, r - 1, c, row, col);
            if (c + 1<col&& board[r][c + 1]=='O')
                findBdCoords(board, r, c + 1,  row, col);
            if (c - 1 >= 0&& board[r][c - 1]=='O')
                findBdCoords(board, r, c - 1,  row, col);
    }
};

看看最简单的 9x9,很明显,如果触摸边框或连接到触摸边框的 O,则 O 不会被包围。

如果我们将边框视为既不是"O"也不是"X"的元素,那么我们可以推广这个规则:如果"O"连接到与既不是"X"也不是"O"的片段连接的"O",则不会将其包围。

我将这个元素称为"B"。

所以你可以用B的ala扩展板

     BBBBBBBBB
     BXXXOOXXB
     BXOXOOXXB
     BXOOXXXXB
     BXXXXXXXB
     BBBBBBBBB

这个想法是,即使你把一些B扔到中间,你的算法仍然应该有效。

然后检查一个 O 单元格是否被包围,如果连接到 B,则很好,否则使用相同的函数(递归)检查其所有 O 邻居。

为了加快速度,您可以为已知已连接的任何单元格设置一个标志。这是伪代码,我相信你可以改进它:

CheckCell(location)
    if connectedLocations[location] return true
    if checkedLocation[location] return false  // This is critical, it stops the infinite spiderweb of neighbor checking.
    if X return false
    if B() return true // whatever you decide B is.
    checkedLocation[location] = true        
    return connectedLocations[location] = CheckCell(north) || CheckCell(south) || CheckCell(east) || CheckCell(west)