Um gráfico *** ameoba **** é um tipo de árvore cujos nós todos têm valores de 0 a algum número inteiro não negativo N e qualquer nó específico com valor x <N se conecta a x + 1 nós distintos com valores x + 1
Gráfico de Ameoba para N = 3: (Denotado A 3 )
Observe que os 2 não têm permissão para compartilhar nenhum dos 3; exatamente três 3 devem "pertencer" a cada 2.
Desafio
Sua tarefa é "aumentar" indutivamente esses gráficos de ameoba em uma grade bidimensional, minimizando avidamente a distância de Manhattan entre os nós:
- Caso base: Um 0 é simplesmente o gráfico
0
. - Etapa indutiva: Um N + 1 é gerado colocando iterativamente os novos nós com valor de N + 1 o mais próximo possível dos nós de valores de N na estrutura A N existente . (Só pode ser o mais próximo possível, pois os pontos mais próximos já podem estar preenchidos.)
Para a etapa indutiva, o procedimento geral que você deve seguir é:
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
(Um procedimento diferente com saída indistinguível é bom.)
Exemplo de crescimento 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
O programa que você escreve deve receber um número de 0 a 8 (inclusive) e gerar um gráfico válido de ameoba, usando o padrão de crescimento indutivo explicado acima.
O que acontece além de 8 não importa.
(A 8 contém 46234 nós que o estão pressionando. Qualquer coisa além de A 8 seria muito longe. Agradecemos a Martin Büttner por perceber isso.)
A entrada deve vir de stdin ou a linha de comando e a saída deve ir para stdout ou um arquivo.
Exemplos (tirados diretamente de cima)
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
* Esse tipo de gráfico já pode ter um nome. Eu admito que acabei de inventá-los. ;)