Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包围区域算法的运行时错误_C++_Algorithm_Runtime Error - Fatal编程技术网

C++ 包围区域算法的运行时错误

C++ 包围区域算法的运行时错误,c++,algorithm,runtime-error,C++,Algorithm,Runtime Error,我提出了一个算法来解决被包围区域的问题,张贴在 但令人伤心的是,我的解决方案可以通过第一个判断输入集,但不能通过第二个较大的输入集,它报告运行时错误。但是,我可以在笔记本电脑上成功运行! 我在这个问题上花了好几个小时,但我还是不知道 下面是问题所在 给定包含“X”和“O”的2D板,捕获由“X”包围的所有区域 通过将所包围区域中的所有“O”翻转为“X”来捕获区域 比如说, X X X X xoox X X O X xOxX 运行功能后,电路板应: X X X X X X X X X X X X x

我提出了一个算法来解决被包围区域的问题,张贴在

但令人伤心的是,我的解决方案可以通过第一个判断输入集,但不能通过第二个较大的输入集,它报告运行时错误。但是,我可以在笔记本电脑上成功运行! 我在这个问题上花了好几个小时,但我还是不知道

下面是问题所在

给定包含“X”和“O”的2D板,捕获由“X”包围的所有区域

通过将所包围区域中的所有“O”翻转为“X”来捕获区域

比如说,

X X X X

xoox

X X O X

xOxX

运行功能后,电路板应:

X X X X

X X X X

X X X X

xOxX

以下是我的解决方案:

类解决方案{
公众:
无效解算(向量和板){
如果(board.size()==0)返回;
int行=board.size();
设置地图;
对于(int i=0;i板[0]。大小()-1)
返回;
int temp=col;
而(temp-1>=0&&board[row][temp-1]='O'&&\
map.find(对(行,temp-1))==map.end(){
地图插入(成对(行,临时-1));
温度-=1;
标记(板、行、温度、地图);
}
温度=柱;
而(temp+1=0&&board[temp-1][col]='O'&&\
map.find(pair(temp-1,col))==map.end(){
地图插入(成对(临时-1,col));
温度-=1;
标记(板、温度、柱、地图);
}
温度=行;

而(temp+1一般来说,在线法官运行的环境与您桌面上的环境完全不同。服务器使用的是商用硬件,这意味着cpu速度慢,内存小。没有什么可以阻止您的代码在线程中运行。此外,您无法控制优化级别和使用的编译器

该错误可能是由于
标记
函数的递归性质造成的。运行时错误imho要么是由于堆栈溢出,要么是由于程序被终止,因为它花费了太多的时间来完成。

函数标记非常不直观且代价高昂。首先,它是递归的,最大深度与电路板的尺寸成线性关系。如果电路板有100万行,我们将有

mark(1000000,...)   
  mark(1000000-1,...)
    ...
      mark(1,...) 
        mark(0,...)
堆栈可能不够大

第二,每次调用时,将同一行或同一列中的每个单元格标记为“被访问”(
map.find(pair(x,y))==map.end()
)的次数比需要的次数多。假设网格为nxn。如果调用标记(x,y)上述测试将对x行和y行的每个位置进行n次。这意味着标记的复杂性为O(n^2)。一般来说,它是O(#行^2+#列^2)

那么你有:

 for(int i=0; i<= row/2; i++){
     int bottom = row-i-1;
     for(int j=i; j<= bottom; j++){
        checkPoint(board, i, j, map);         <--O(n^2)
        checkPoint(board, bottom, j, map);    <--O(n^2)
        checkPoint(board, j, i, map);         <--O(n^2)
        checkPoint(board, j, bottom, map);    <--O(n^2)
     }
  }

在每个标记中,将再次测试完整的行。这将对函数
map.find(pair(A,B))进行n次调用
。因此n^2的复杂性。

我同意另一个答案,要么您使用了太多的运行时间或堆栈空间。试试这个想法。注意,对于连接的“O”区域,要么该区域接触到电路板的边缘,要么该区域完全被“X”包围。因此,您可以使用以下策略。首先沿着ed进行操作在找到一个“O”之前,对电路板进行ges操作。然后初始化一个集合CurrentBoundaryO,使其等于仅此一个“O”的集合,并初始化一个集合NextBoundaryO,使其为空。然后迭代执行以下操作。将CurrentBoundaryO中的每个位置标记为“未更改的O”。然后迭代CurrentBoundaryO的元素,并检查所有邻居。每个未标记为“未更改O”的“O”邻居都应添加到set-NextBoundaryO。然后设置CurrentBoundaryO=NextBoundaryO并重复,直到CurrentBoundaryO没有任何元素。然后继续搜索电路板边缘,直到找到未标记为“未更改O”的“O”,并重复该过程。继续重复直到您沿着电路板的整个边缘移动。然后每个“X”仍然是一个“X”,每个标记为“未更改的O”的“O”仍然是一个“O”,并且电路板上的所有其他“O”都应该切换到“X”。此策略在输入大小方面以线性时间运行,并且它避免了递归,因此也没有堆栈空间问题。这应该通过判断软件评估。

可以在笔记本电脑上工作,但不能在台式机上工作?哪些操作系统?32位64位?@huseyintugrulbuyukisik,不,你误解了,它可以在我的笔记本电脑上使用Ubuntun 12.04,但不能在leetcode在线判断平台上工作。至少它不能通过最后一个输入的测试。你的解释在某种程度上是有道理的。Bu我只在点位于矩阵边缘时调用mark()。因此它不会像你说的那样花费太多时间。而且它会报告运行时错误,不会超出时间限制。但是,我最好考虑另一种方法来完成mark()的工作。谢谢这正是我想要做的。但也许我的方法效率不够。。。。
 for(int i=0; i<= row/2; i++){
     int bottom = row-i-1;
     for(int j=i; j<= bottom; j++){
        checkPoint(board, i, j, map);         <--O(n^2)
        checkPoint(board, bottom, j, map);    <--O(n^2)
        checkPoint(board, j, i, map);         <--O(n^2)
        checkPoint(board, j, bottom, map);    <--O(n^2)
     }
  }
  mark(x,y-1)
  mark(x,y-2)
  ...
  mark(x,0)