2016-07-19 16 views
2

私はランダムにスライスされた長方形のグリッドを持っています - 幅は80単位です。グリッド内の四角形をグループ化する

Iはすでに以下のようにアレイに記憶されている私のグリッドの各列の自由空間を有する:Pxが出発点であり、SX、各矩形の幅を表し

[ 
    {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[i]+sX[i] = pX[i+1]です。どのようにこれらの配列のエントリをグループ化し、隣接する最大の幅を持つ結果の長方形を得ることができますか?

+0

あなたは所望の出力を投稿することができますか? –

+0

@NenadVracar: '{{pX:1、sX:15}、{pX:30、sX:31}]、[{pX:1、sX:60}]' – deblocker

答えて

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 
+0

はい! 「締め付け」ではなく、「締め付け」はここで正しい方法です! TurboPascal-timeへのピッチに感謝します。 – deblocker

関連する問題