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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 - Fatal编程技术网

C++ 给定一个矩形区域和一组矩形,检查它们是否覆盖整个区域

C++ 给定一个矩形区域和一组矩形,检查它们是否覆盖整个区域,c++,algorithm,C++,Algorithm,这里的所有值都是实数,最多有两个浮点数 假设我们有一个矩形区域,100.0by75.0 然后给你一组矩形。我怎样才能检查这些统一的矩形是否覆盖了整个区域 如果我们有 (0,0,50,75) (0,0,50,75) (50,0,50,75) 显然,这并没有发生,因为它只覆盖了一半的面积。如果我们有 (0,0,50,75) (0,0,50,75) (50,0,50,75) 这样就行了,因为两个矩形都将有效地覆盖整个(100,75) 我试过什么 我尝试(没有成功)制作一个多维布尔数组: boo

这里的所有值都是实数,最多有两个浮点数

假设我们有一个矩形区域,
100.0
by
75.0

然后给你一组矩形。我怎样才能检查这些统一的矩形是否覆盖了整个区域

如果我们有

(0,0,50,75)
(0,0,50,75)
(50,0,50,75)
显然,这并没有发生,因为它只覆盖了一半的面积。如果我们有

(0,0,50,75)
(0,0,50,75)
(50,0,50,75)
这样就行了,因为两个矩形都将有效地覆盖整个
(100,75)

我试过什么

我尝试(没有成功)制作一个多维布尔数组:

bool area[10000][7500];
这些是面积的尺寸,乘以100,这样我就不用处理浮点了。然后我迭代每个矩形(它们的值也乘以100),对于其中的每个“像素”,我将布尔值转换为
true

最后,我检查该区域中的所有布尔值是否
true


这被证明是非常愚蠢的。你能帮我找到更好的方法吗?

我认为这样的策略会奏效:

  • 扔掉所有完全超出你的区域的矩形
  • 沿列表中相对于一个轴的矩形边缘将区域分割为较小的矩形
  • 沿封面列表中相对于另一个轴的矩形边缘拆分步骤2中创建的区域矩形列表
  • 现在有两个矩形列表,其中封面列表中必须有一个完全覆盖每个区域矩形

  • 我认为这样的策略会奏效:

  • 扔掉所有完全超出你的区域的矩形
  • 沿列表中相对于一个轴的矩形边缘将区域分割为较小的矩形
  • 沿封面列表中相对于另一个轴的矩形边缘拆分步骤2中创建的区域矩形列表
  • 现在有两个矩形列表,其中封面列表中必须有一个完全覆盖每个区域矩形

  • 从概念上讲,与500-内部服务器错误非常相似的方法可以避免最后一步隐含的O(n^2)搜索:

  • 从覆盖集合中建立每个矩形的垂直边界列表 如果假设是n个边界,则在源矩形上有n条1条垂直条带;李>
  • 对于每个条带,获取重叠的所有矩形的列表(您可以在O(n)时间内完成此操作,方法是从矩形推到箱子,而不是向后搜索)
  • 从左到右排序列表(即O(n logn))
  • 浏览已排序的列表,并尝试找到一个空白,在该空白处,一个跨度结束,而在稍晚一点之前,没有任何其他内容开始(另一个O(n)任务)

  • 如果找到合适的间隙,则不包括原始间隙。如果你不知道,那就是。顺便说一句,这就是span缓冲的工作原理。

    一种概念上非常类似于500内部服务器错误的方法,它避免了最后一步隐含的O(n^2)搜索:

  • 从覆盖集合中建立每个矩形的垂直边界列表 如果假设是n个边界,则在源矩形上有n条1条垂直条带;李>
  • 对于每个条带,获取重叠的所有矩形的列表(您可以在O(n)时间内完成此操作,方法是从矩形推到箱子,而不是向后搜索)
  • 从左到右排序列表(即O(n logn))
  • 浏览已排序的列表,并尝试找到一个空白,在该空白处,一个跨度结束,而在稍晚一点之前,没有任何其他内容开始(另一个O(n)任务)
  • 如果找到合适的间隙,则不包括原始间隙。如果你不知道,那就是。顺便说一句,这就是span缓冲的工作原理。

    我相信您的“位图”尝试失败是因为(通常)浮点舍入问题。不幸的是,你对此无能为力

    现在,对于正确的算法,我将使用减法技术来处理它

    • 让我们把初始的矩形集称为R
    • 初始化第二组矩形,这些矩形最初包含一个覆盖整个区域的矩形
    • 对于R中的每个矩形:
      • 对于S中的每个矩形:
        • 如果两个R和S矩形相交,则根据需要将S矩形替换为覆盖S矩形左侧非相交部分的尽可能多的矩形(如果我没有弄错的话,则为0到4)
        • 继续在S上迭代,注意不要为刚刚添加的新S矩形计算任何内容(我们已经知道它与当前R矩形不相交)
      • 继续在R上迭代,这次考虑新的S矩形,直到:
        • S中没有剩余的矩形,在这种情况下,R矩形确实覆盖了整个区域
        • 或者,您迭代了所有R矩形,但仍然剩下S个矩形,在这种情况下,您的R矩形不会覆盖整个区域
    至于复杂性,我不确定它与@500 Internal Server Error或@Tommy的解决方案相比如何,但嘿,至少我设法想出了一些东西,当我一开始读你的问题时,我认为我做不到——我通常不太擅长空间方面的东西。:)

    我相信您的“位图”尝试失败是因为(通常)浮点舍入问题。不幸的是,你对此无能为力

    现在,对于正确的算法,我将使用减法技术来处理它

    • 让我们把初始的矩形集称为R
    • 初始化第二组矩形,这些矩形最初包含一个覆盖整个区域的矩形
    • 对于R中的每个矩形:
      • 对于S中的每个矩形:
        • 如果两个R和S是矩形的