この画像を見てください。具体的には、端の穴の配置方法。
(画像ソース)
この画像のパイプが六角形のパターンでどのように詰められているかに注目してください。2Dでは、六方格子が円の最も密なパッキングであることが知られています。この課題では、円のパッキングの周囲の最小化に焦点を当てます。境界線を視覚化する便利な方法の1つは、輪のコレクションの周りに輪ゴムを置くことを想像することです。
タスク
n
入力として正の整数を指定するn
と、できるだけ密にパックされた円のコレクションが表示されます。
規則と説明
- 円の直径は1ユニットであると仮定します。
- 最小化される変数は、グループ内の円の中心の凸包であると定義されている周囲の長さです。この画像を見てください:
直線の3つの円の周囲は4(凸包は2x0の長方形で、2は2回カウントされます)、120度の角度で配置された円の周囲は約3.85、三角形の周囲はわずか3ユニットです。円の中心ではなく、円の端だけを見ているため、実際の境界線となる追加のpi単位を無視していることに注意してください。
- 任意のに対して複数のソリューションが存在する可能性があります(ほぼ確実に存在します)
n
。これらのいずれかを自由裁量で出力できます。向きは関係ありません。 - 円は六角格子上になければなりません。
- 円の直径は少なくとも10ピクセルである必要があり、塗りつぶしてもしなくてもかまいません。
- プログラムまたは関数のいずれかを作成できます。
- 入力は、STDINを介して、関数の引数として、または最も近いものとして取得できます。
- 出力は表示されるか、ファイルに出力されます。
例
以下に、1から10までのnの有効および無効な出力の例を示します(有効な例は、最初の5つのみです)。有効な例は左側にあります。右側のすべての例は、対応する有効な例よりも大きな境界線を持っています。
この課題の作成を支援してくれたsteveverrillに感謝します。ハッピーパッキング!