*** ameobaグラフ****は、すべてのノードの値が0から非負の整数Nであり、値x <Nの特定のノードが値x +のx + 1個の異なるノードに接続するツリーのタイプです1。
N = 3のアメオバグラフ(A 3と表示)
2が3を共有することは許可されていないことに注意してください。正確に3つの3が各2に「属する」必要があります。
チャレンジ
あなたの仕事は、ノード間のマンハッタン距離を貪欲に最小化することによって、これらのアメオバグラフを2次元グリッドで誘導的に「成長」させることです。
- 基本ケース: A 0は単なるグラフ
0
です。 - 帰納的ステップ: A N + 1は、新しいN + 1値ノードを既存のA N構造内のN値ノードのできるだけ近くに繰り返し配置することによって生成されます。(最も近いスポットはすでに満たされている可能性があるため、可能な限り近くすることができます。)
誘導ステップの場合、従う必要がある一般的な手順は次のとおりです。
for each existing node P with value N:
for each new N+1 valued node Q you need to connect to P: //this loops N+1 times
find the set of vacant spots that are minimally distant from P //by Manhattan distance
place Q in any of these vacant spots
(出力を区別できない別の手順で問題ありません。)
A 4の成長例:
A0 is always the same:
0
For A1 I happen to put the 1 to the right of the 0 (it has to go on one of the 4 open sides):
01
For A2 I happen to put the two 2's above and to the right of the 1:
2
012
For A3 I find that one of the six 3's I must place cannot be directly next to a 2, so I put in one of the next closest places:
3
323
0123
33 <-- this 3 is distance two away from its 2
The process continues in A4. Note that I'm iterating over each 3 and placing four 4's next to it or as close as possible, then moving to the next 3 (the order of 3's does not matter):
444
443444
4323444
4012344
44334
4444
44
Always keep in mind that nodes cannot be "shared".
プログラム
作成するプログラムは、0から8までの数値(両端を含む)を取り、上記の誘導的成長パターンを使用して、その有効なameobaグラフを出力する必要があります。
8を超えて何が起こるかは問題ではありません。
(A 8は、それを推進している46234個のノードが含まれています。Aを超えた何か8は遠すぎるだろう。これに気付いためのマーティンBüttnerに感謝を。)
入力はstdinまたはコマンドラインから取得し、出力はstdoutまたはファイルに送信する必要があります。
例(上記から直接取得)
Input: 0
Output:
0
Input: 1
Output:
01
Input: 2
Output:
2
012
Input: 3
Output:
3
323
0123
33
Input: 4
Output:
444
443444
4323444
4012344
44334
4444
44
*これらのタイプのグラフにはすでに名前が付いている場合があります。私はちょうどそれらを作ったと認めます。;)