包围的区域不适用于更大的输入
Surrounded Regions not working for larger input
我无法让我的代码解决这个问题,也不确定如何找出原因。它在小集合上工作,但在大集合上失败。
给定一个包含"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)
相关文章:
- 打印时有二叉树问题.用户输入不打印任何内容
- C++数组输入不接受一定数量的整数
- C++ 限制或使用户输入不可见 (std::cin)
- OpenGL/Glew C++纹理不适用
- 异常处理:如果用户输入不是三个特定字符之一
- 使用 std::cin 的输入仅适用于浮点数,仅当值尾随字母"e"(大写和小写)时
- 当我在 windows7 中安装程序时,我指定的字体大小不适用
- 对于代码中指定的边界之外的值,对角差算法的输入不正确
- 特殊键输入不起作用(输入,backspace,tab等)
- accelerator.cu(8): 错误:属性"managed"在这里不适用?
- 输入不匹配 JNA
- 键盘输入不与WebAssembly和Emscripten配合使用
- typedef X=<T>T::UserType1,但如果不适用,typedef X<T>=UserType2
- 使用系统命令时发送输入不起作用
- 防止在流中输入不需要的价值
- 输入不会影响使用的 if 语句
- 如何检测控制台输入不是C++中的数字
- 用C++编写一个程序,对一个简单的序列求和:1/N + 2/N-1 + 3/N-2+ ...不适用
- C :GOTO和用户输入不合作
- 为什么这个提升::精神::qi规则与输入不匹配