5

さまざまな寸法の長方形のリストがあります。

rects = [100x20, 30x10, 10x10, 70x20, 40x30, 50x10]

これらの長方形からテーブルをレンダリングしようとしています。列の数が決まっている場合は、次のように行数と各行と列のサイズを計算できます。

numCols = 4;

for (i = 0; i < rects.size - 1, i++):
    rect = rects[i];
    col = i % numCols;
    row = floor(i / numCols);

    columns[col] = max(columns[col], rect.width);
    rows[row] = max(rows[row], rect.height);
end for;

ここで、テーブルを最大行幅で構成する必要があります。列の数は、最適な行幅の実行時の計算によって異なります。

上記のリストと140に設定された最大行を使用すると、テーブルは次のようになります。

rects = [100x20, 30x10, 70x10, 10x20, 40x30, 10x10]

100x20, 30x10
70x10, 10x20
40x30, 10x10

cols = [100, 30]
rows = [20, 20, 30]

この状況にアプローチするための私の最初のアイデアは、可能な列の数ごとに最大列幅をキャッシュすることです。合計<=最大行幅の最後のエントリが優先されます。

max[1] = [100]
max[2] = [100, 30] - wins
max[3] = [100, 40, 70] - 210 > 140
max[4] = [100, 30, 70, 10]
max[5] = [100, 30, 70, 10, 40]
max[6] = [100, 30, 70, 10, 40, 10]

残念ながら、可能な列番号ごとに最大でエントリを作成する必要があります。リストはかなり大きくなる可能性があります。誰かがこの最適化問題を解決するためのアルゴリズムを知っていますか?

4

2 に答える 2

1

ソリューションの最適化のみが表示されます。

前提:
MaxAllowedWidth- すべての列幅の最大許容合計

  1. 考えられる解決策 (最後のテーブル) を探すときは、列の合計幅が を超えたときに新しい列を追加しようとするのをやめてくださいMaxAllowedWidth。サンプルでは、​​3 番目のステップで停止し、4、5、6 列を試さないでください。3 列は、許可されているよりも多くのスペースを使用するためです。このステップでは、アイテムの最初の行のみを考慮していることに注意してください。

  2. 前のステップで受け取った可能性のある列番号を逆の順序で調べます。最初に適用可能なソリューションは、行数が最小限になるため最適です。

  3. ステップ 2 で、この列数が実際に に収まるかどうかを確認する必要があります MaxAllowedWidth。サンプルでは、​​合計幅 = 130 (100 + 30) から開始します。次に、列を調べて、この特定の列を拡大する必要があるかどうかを確認する必要があります。列を拡大する必要がある場合は、拡大された列が残っているよりも多くのスペースを必要とするかどうかを確認してください。その後、より少ない列で解決策を試してください。このチェックにより、早期に終了し、無駄な反復/操作をスキップできます。

質問の説明が明確ではありません。コメントを読むまで、何が欲しいのかわかりませんでした。max row width私には意味がありませんがtotal columns width、IMOのように聞こえます。

于 2011-03-03T14:51:26.207 に答える
0

この質問を完了するために、結果のテーブル レイアウトが実際に動作しています。最大幅を設定できます。列数は、このスレッドで説明されているアルゴリズムに基づいて計算されます。

http://sibirjak.com/osflash/projects/as3commons-ui/layouts/showcase/#a6-dyntable

編集:

ボックスの数を変更するには、例のフラッシュ ウィンドウの下部にあるタスク バーからボックス ウィンドウを開いてください。

于 2011-04-18T13:17:41.120 に答える