【发布时间】:2020-12-15 06:57:22
【问题描述】:
给定以下 c# 数组:
const bool X = true, _ = false;
bool[,] array = new bool[,] {
{ X, X, X, X, _, X, X, X, _, _ },
{ _, _, _, _, _, X, X, X, X, _ },
{ X, X, X, X, X, X, X, X, X, X },
{ X, X, X, X, X, X, X, X, X, X },
{ _, X, X, X, _, X, _, _, X, X },
{ _, X, X, X, _, X, X, _, X, X },
{ _, _, _, X, X, _, _, _, _, _ },
{ X, X, _, X, X, _, X, X, X, _ },
{ _, X, X, _, _, X, X, X, X, X },
{ _, _, X, X, _, _, X, X, X, X },
};
视觉上是这样的:
是否有任何现有的方法可以将其转换为尽可能少的矩形区域?
一个可能的解决方案可能是这样的:
理想情况下,我正在寻找可以生成矩形列表的东西:
public IEnumerable<Rectangle> ReduceMap(bool[,] map)
{
List<Rectangle> rects = new List<Rectangle>();
int width = map.GetLength(0), height = map.GetLength(1);
// Reduce
// ....?
return rects;
}
结果会是这样的:
var output = new List<Rectangle>
{
new Rectangle(0, 0, 4, 1),
new Rectangle(5, 0, 3, 2),
new Rectangle(8, 1, 1, 1),
new Rectangle(0, 2, 10, 2),
// ... etc
};
速度也很重要,矩形越少越好,但找到一个合适的解决方案不应该在计算上过于昂贵。
抱歉,如果之前已经回答过这个问题,如果有人知道在哪里看,那就太好了!
【问题讨论】:
-
只是为了理解需求:你想解决什么问题?应用程序是什么?
-
我认为这是 完美 解决方案的 NP 难题。
-
@Fildor:我正在尝试将一组已知的矩形多边形粘合在一起,以用于应用于平铺贴图的动态照明阴影贴图算法。将所有瓦片单独装壳太贵了,减少这个空间将允许动态重新计算。
-
@Dai:同意,虽然不需要完美的解决方案。
-
这听起来像是四叉树压缩。
标签: c# arrays algorithm optimization reduction