我有一个随机切片的矩形网格 - 宽度为80个单位。
我的网格中每行的空闲空间都存储在如下所示的数组中:
[
{pX:1,sX:15},
{pX:30,sX:13},
{pX:43,sX:1},
{pX:44,sX:17}
],
[
{pX:1,sX:15},
{pX:16,sX:14},
{pX:30,sX:13},
{pX:43,sX:1},
{pX:44,sX:17}
]
其中pX是起点,sX代表每个矩形的宽度。
某些数组条目相邻,即pX[i]+sX[i] = pX[i+1]
。如何将这些数组条目组合在一起,得到最大相邻宽度的结果矩形?
答案 0 :(得分:0)
您需要收紧阵列,连接相邻的线段。此代码( Delphi,将其视为伪代码)以所需方式收缩数组:
var
pX, sX: TArray<Integer>;
i, removed: Integer;
begin
pX := [1, 30, 43, 44, 64, 66, 69, 72];
sX := [15, 13, 1, 17, 2, 2, 3, 5];
removed := 0;
for i := 1 to High(pX) do begin
if (pX[i - removed - 1] + sX[i - removed - 1] = pX[i]) then
begin ////join neighbors
sX[i - removed - 1] := sX[i - removed - 1] + sX[i];
Inc(removed); ////removed++
end
else
if (removed > 0) then
begin ////copy to new place
pX[i - removed] := pX[i];
sX[i - removed] := sX[i];
end;
end;
////shorten array, remove tail
SetLength(px, Length(pX) - removed);
SetLength(sX, Length(sX) - removed);
////output result
Memo1.Lines.Add(ArrayToString(pX));
Memo1.Lines.Add(ArrayToString(sX));
输出
1 30 64 69
15 31 4 8