将2D数组解析为矩形

时间:2012-09-30 01:12:08

标签: c# arrays algorithm rectangles

我正在寻找一种方法将2D数组转换为尽可能少的矩形,如下例所示:

       X
    12345678
    --------
  1|00000000
  2|00011100
  3|00111000
Y 4|00111000
  5|00111000
  6|00000000

到矩形的角坐标:

跟随(x1,y1);(x2; y2)模板

rectangle #1 (4,2);(6,2)
rectangle #2 (3,3);(5,5)

此前有一个类似的问题,但遗憾的是,其答案中提供的链接已被破坏,我无法再查看。

我想在C#中做到这一点,但感谢任何帮助。

(它甚至不必是最少的矩形,但越少越好:))

提前致谢!

2 个答案:

答案 0 :(得分:1)

我认为你试图用最小所需数量的矩形覆盖2D平面中的一组点。对Find k rectangles so that they cover the maximum number of points的回答说这是一个NP完全问题,并与http://www.almaden.ibm.com/u/kclarkson/set_cover/p.pdf(对我有效)相关联。谷歌搜索找到了http://2011.cccg.ca/PDFschedule/papers/paper102.pdf

有论文同意矩形覆盖是NP完全的,但实际上并没有证明,并且对此的参考似乎异常难以捉摸 - https://cstheory.stackexchange.com/questions/3957/prove-that-the-problem-of-rectilinear-picture-compression-is-np-complete

我从这些文件中得到的是:

1)对于大问题,不太可能有一种经济实惠的方法来获得绝对最佳的答案,所以你可能要花费大量的时间来获得某些意义上很小的问题的确切答案。在所有可能的替代方案中,或者使用像分支和绑定之类的东西,或者购买价格合理的方法 - 例如贪婪搜索,光束搜索或有限差异搜索 - 这些都不能保证给你绝对最好的答案。

2)在这种情况下,似乎有更多限制版本的问题不是NP完全的。您可能会阅读一篇论文,并发现您的问题有一些细节,这意味着此方法适用于您。一个例子是“用矩形构造区域的算法: 独立性和最小生成集 对于间隔的收集*“由Franzblau和Kleitman - 我在ACM数字图书馆中发现了这一点 - 我不知道它是否通常是可访问的。它适用于一组有限的多边形。

答案 1 :(得分:0)

这可以帮助您入门。如果将二进制数据转换为数字,则可以得到:

0
28
56
56
56
0

所以只要有连续相等的数字,就会有一个矩形。