Imagine o seguinte cenário: você está jogando com um amigo, mas decide trapacear. Em vez de mover um navio depois que ele atira onde costumava estar, você decide não colocar nenhum navio. Você diz a ele que todos os seus tiros são errados, até que seja impossível colocar navios dessa maneira.
Você precisa escrever uma função, ou um programa completo, que de alguma forma leve três argumentos: o tamanho do campo, uma lista de quantidades de tamanhos de navios e uma lista de fotos.
Campo de batalha
Um dos parâmetros fornecidos é o tamanho da placa. O campo de batalha é um quadrado de células e o parâmetro fornecido é simplesmente um lado do quadrado.
Por exemplo, a seguir é uma placa de tamanho 5.
As coordenadas no campo são especificadas como uma sequência de dois componentes: uma letra seguida por um número. Você pode confiar nas letras em algum caso específico.
Letter especifica a coluna, number especifica a linha da célula (indexada 1). Por exemplo, na figura acima, a célula destacada é indicada por "D2"
.
Como existem apenas 26 letras, o campo não pode ser maior que 26x26.
Navios
Os navios são linhas retas de 1 ou mais blocos. A quantidade de navios é especificada em uma lista, onde o primeiro elemento é o número de navios com 1 célula, o segundo - navios com 2 células e assim por diante.
Por exemplo, a lista [4,1,2,0,1]
criaria o seguinte conjunto de remessas:
Quando colocados no campo de batalha, os navios não podem se cruzar ou até se tocar. Nem mesmo com cantos. No entanto, eles podem tocar as bordas do campo.
Abaixo, você pode ver um exemplo de colocação de navio válida:
Você pode supor que, para um determinado conjunto de navios, sempre exista um posicionamento em um tabuleiro vazio de determinado tamanho.
Saída
Se essas colocações de navios existirem, você deverá produzir uma delas.
O programa precisa produzir uma matriz separada por nova linha de caracteres ascii de qualquer um dos três tipos - um para indicar célula em branco, um - uma peça de navio e um - uma célula marcada como "perdida". Nenhum outro caractere deve ser produzido.
Por exemplo,
ZZ@Z
\@@Z
@\\Z
\Z\\
(Neste exemplo, eu defini @
como célula em branco, célula \
"perdida" e Z
peça de expedição)
Se esse posicionamento não existir, o programa / função deve retornar sem gerar nada.
Entrada
Se você decidir criar um programa completo, cabe a você especificar como as listas são inseridas, algumas podem ser via argumentos, outras via stdin.
Isso é código-golfe , a menor quantidade de caracteres ganha.
Um exemplo de solução otimizada sem golfe pode ser encontrado aqui
Compile com -std=c99
, o primeiro argumento é o tamanho do tabuleiro, os outros argumentos são os tamanhos dos navios. Uma lista de tiros separada por nova linha é fornecida no stdin. Exemplo:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
com um 4,3,2,1
shipset
26x26
? Eu esbocei uma solução baseada em regexps e recursão, e ela fica extremamente lenta = inutilizável para campos acima de6x6
. Ou faço algo muito estúpido, ou falta de respostas significa que outros também não têm sucesso.