【发布时间】:2011-08-14 05:11:58
【问题描述】:
假设我有一个 7x12 的方块网格。我们使用颜色 '*'、'%'、'@' 和空单元格 '-'。
1 2 3 4 5 6 7
- - - - - - - 1
- - - - - - - 2
% % - - - - - 3
% % - - - - * 4
% % - - - @ % 5
@ @ @ - - @ % 6
@ @ * * * - * 7
* * * % % % % 8
% @ @ % * * % 9
% @ % % % % % 10
* * * % % @ @ 11
* * @ @ @ @ * 12
我想在这个网格中找到某个最小尺寸的矩形,我能找到最大的,然后再变小,直到找不到大于或等于最小尺寸的矩形。
在此示例中,考虑最小尺寸 1x4、4x1、2x2,因此 1x3 无效,但 2x3 有效。如果我们想要最大的矩形,我们会找到以下内容:
- 4x1 在 (4,8)
- 5x1 在 (3,10)
- 2x3 在 (1,3)
- 2x2 在 (6,1)
- 2x2 在 (1,11)
- 4x1 在 (3,12)
请注意,矩形不能在彼此的空间中,它们不能重叠。例如,没有提到 (4,10) 处的 2x2 矩形,因为它会与 (3,10) 处的 5x1 矩形重叠。
所有都是完全有效的矩形:它们等于或大于最小尺寸,并且每个矩形的所有块都具有相同的颜色。
我想要以编程方式执行此操作。当您告诉某人在网格中查找矩形时,他会立即找到它们,而无需考虑。问题是,我怎样才能写出同样的算法?
我考虑过暴力破解,但我需要算法尽可能快地执行,因为它需要在有限的(移动)设备上在非常短的时间内执行很多次。
我在互联网上看到很多关于矩形的问题,但我很惊讶这个问题还没有被问到任何地方。是我想得太难了,还是从来没有人想做这样的事情?
【问题讨论】:
-
矩形可以交叉吗?我看到你没有在 (4,10) 处提到 2x2,是因为它在 (3,10) 处与更大的 5x1 有一个共同的部分吗?
-
不,矩形不能相互交叉。每个矩形不能在其他矩形的空间中。
-
@Sebeazz 不会根据矩形的顺序来取消资格吗?
-
@GlowCoder:不,因为我想先找到最大的。