Un *** ameoba graph **** es un tipo de árbol cuyos nodos tienen valores de 0 a algún número entero no negativo N, y cualquier nodo particular con valor x <N se conecta a x + 1 nodos distintos con valores x + 1)
Gráfico de Ameoba para N = 3: (Denotado A 3 )
Tenga en cuenta que los 2 no pueden compartir ninguno de los 3; exactamente tres 3 deben "pertenecer" a cada 2.
Desafío
Su tarea es "hacer crecer" inductivamente estos gráficos de ameoba en una cuadrícula bidimensional minimizando con avidez la distancia de Manhattan entre nodos:
- Caso base: Un 0 es simplemente el gráfico
0
. - Paso inductivo: se genera un N + 1 colocando iterativamente los nuevos nodos valorados N + 1 lo más cerca posible de los nodos de los valores N en la estructura A N existente. (Solo puede estar lo más cerca posible ya que los lugares más cercanos pueden estar llenos).
Para el paso inductivo, el procedimiento general que debe seguir es:
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
(Un procedimiento diferente con salida indistinguible está bien).
Ejemplo de crecimiento para 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".
Programa
El programa que escriba debe incluir un número del 0 al 8 (inclusive) y generar un gráfico de ameoba válido, utilizando el patrón de crecimiento inductivo explicado anteriormente.
Lo que sucede más allá de 8 no importa.
(A 8 contiene 46234 nodos que lo están empujando. Cualquier cosa más allá de A 8 estaría demasiado lejos. Gracias a Martin Büttner por notar esto).
La entrada debe provenir de stdin o la línea de comando y la salida debe ir a stdout o un archivo.
Ejemplos (tomados directamente de arriba)
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
* Es posible que este tipo de gráficos ya tenga un nombre. Admito que acabo de inventarlos. ;)