我不能让我的代码适用于这个问题,我不知道如何找出原因。它适用于小集,但在大集合中失败。
给定包含'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);
}
};
答案 0 :(得分:0)
查看最简单的9x9,很明显,如果触摸边框或连接到触摸边框的O,则 O不会被包围。
如果我们将边界视为既不是'O'也不是'X'的元素,那么我们可以概括这个规则: 如果'O'连接到与既不是'X'也不是'O'连接的'O',它就不会被包围。
我将这个元素称为'B'。
所以你可以用B's 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)