Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 查找网格中位于边界上并包含点的最大矩形_Algorithm_Grid_Rectangles - Fatal编程技术网

Algorithm 查找网格中位于边界上并包含点的最大矩形

Algorithm 查找网格中位于边界上并包含点的最大矩形,algorithm,grid,rectangles,Algorithm,Grid,Rectangles,我有一个代码,可以遍历自由和“阻塞”位置的网格;并找到可能的最大矩形 这个很好用。然而,我需要能够找到更具体的标准矩形。考虑以下事项: 00X0000000 000000#### ########## ####000000 0000000000 0000000000 在这个图中;0标记可用位置,#标记占用位置,X标记所需点 我现在的代码将找到网格的右下角区域,因为这确实是最大的矩形。但是,我想要的答案包含X位置(左上角的矩形) 我不知道如何着手添加这个额外的标准。我还试图跟踪坐标;抛出不包含X

我有一个代码,可以遍历自由和“阻塞”位置的网格;并找到可能的最大矩形

这个很好用。然而,我需要能够找到更具体的标准矩形。考虑以下事项:

00X0000000
000000####
##########
####000000
0000000000
0000000000
在这个图中;0标记可用位置,#标记占用位置,X标记所需点

我现在的代码将找到网格的右下角区域,因为这确实是最大的矩形。但是,我想要的答案包含X位置(左上角的矩形)

我不知道如何着手添加这个额外的标准。我还试图跟踪坐标;抛出不包含X的结果;但这并不总是奏效。在某些条件下,我会得到比预期更小的矩形(可能是因为我遍历网格的顺序)

我发现的所有算法似乎都只能找到最大的矩形和矩形的坐标。我还没有找到任何能够排除不包含特定点的结果的方法

谁能给我指出正确的方向,和/或提供一个实现方案

编辑: 因为注释不能有换行符,所以我需要用这个区域来解释shole实现中的问题。对于以下情况,它将失败:

#0#X
###0
#000
####
0#00
0000
0000
在上面的示例中,返回的坐标形成一个矩形,如下所示:

0#X
##0
000
答案应该是1x3,而不是3x3

另一个失败的例子:

0#X#
0000
00##
000#
0000
返回:

#X
00
在这种情况下,返回的答案应该是1x2区域,而不是2x2区域

在某些情况下,它返回的区域大于整个栅格的区域,坐标超出有效坐标的范围


这有时是可行的,但它往往是错误的,而不是正确的。它总是返回一个包含点的区域;只是区域/坐标错误。

有趣的问题,这里是我的O(R*C)算法,R=#行,C=#列

想法很简单,用蛮力将每个点作为潜在矩形的底部边界,然后尝试爬到尽可能高的地方以获得最大高度,然后获得这条垂直线的最大左右距离

这测试了所有可能的矩形,但我们必须快速完成。 我们通过动态规划,一行一行地计算每一个(i,j)的最大高度、最大左右距离

然后我们可以测试X是否在这个潜在的矩形内,如果是,我在这个矩形的区域中添加一个无限大的偏移量,它足够大,任何不包含X的矩形都将小于它,而其他矩形,如果包含X且大于它,我们仍然可以选择该矩形

在算法结束后,我们得到最大的面积+偏移量,我们从中减去偏移量,然后得到面积

如果运行代码(C++)并查看下面的日志,以及以下输入,则更容易理解:

6 10
00X0000000
000000####
##########
####000000
0000000000
0000000000
#包括
使用名称空间std;
charw[20][20];
int tl[20][20]={0},tr[20][20]={0},h[20][20]={0},l[20][20]={0},r[20][20]={0};
int ans、R、C、xr、xc、ar1、ac1、ar2、ac2;
int largestRect()
{
int面积=0;

对于(int i=0;i底部的两行不是最大的矩形吗?“区域”是20(零的数量)。右下角有区域18。你是对的。我一直在盯着它。不过一般的想法是,我不想返回任何底部的矩形,只返回其中有X点的矩形。你可以从X开始,然后上下左右移动(像一个涟漪)并展开,直到得到一个“#”。散列附近的坐标将是这样一个最大矩形的端点之一。@user1952500否…实际上答案的端点可能不在任何散列附近…在OP的示例中,点(1,6)是答案的一个点,但在散列附近没有…@shole,我说过散列附近的坐标将是端点之一,而不是另一个端点。上面的答案矩形的右下角将位于散列旁边。我试图将其转换为C#(我的项目所需的语言)为什么我都不理解这个代码。为什么所有的数组20x20,当输入是6x10?为什么L和R数组初始化为如此高的值,而不是TR和TL?这只是一个C++的东西,额外的元素甚至没有被使用?它工作吗?哪一个部分你不明白?我试图解释更多,很难去UND。乍一看是可以理解的,因为它背后有一个聪明的DP概念,我还不知道,因为我还没有完成转换。哈哈。一行一行地看,我认为在分配r[I][j]时可能有一个错误。这个循环不是应该朝相反的方向走吗?不……你可能把r[I][j]和tr[I][j],tr I][j]混淆了必须是反向的,l[i][j]和r[i][j]不需要,也许我现在在我的答案中添加了一个解释:)请尝试查看编辑的部分,看看您是否能够理解算法和代码:)