Imaginez le scénario suivant: vous jouez à des cuirassés avec un ami mais décidez de tricher. Plutôt que de déplacer un navire après qu'il ait abattu votre navire là où vous vous trouviez, vous décidez de ne placer aucun navire. Vous lui dites que tous ses coups sont ratés, jusqu'à ce qu'il soit impossible de placer les navires de cette manière.
Vous devez écrire une fonction, ou un programme complet, qui prend en quelque sorte 3 arguments: la taille du champ, une liste des quantités de tailles de vaisseaux et une liste de plans.
Champ de bataille
L'un des paramètres donnés est la taille du tableau. Le champ de bataille est un carré de cellules, et le paramètre donné est simplement un côté du carré.
Par exemple, voici un tableau de taille 5.
Les coordonnées du champ sont spécifiées en tant que chaîne à 2 composants: une lettre suivie d'un nombre. Vous pouvez compter sur les lettres dans certains cas.
Lettre spécifie la colonne, nombre spécifie la ligne de la cellule (indexé 1). Par exemple, dans l'image ci-dessus, la cellule en surbrillance est désignée par "D2"
.
Comme il n'y a que 26 lettres, le champ ne peut pas dépasser 26x26.
Navires
Les navires sont des lignes droites de 1 ou plusieurs blocs. La quantité de navires est spécifiée dans une liste, où le premier élément est la quantité de navires à une cellule, le deuxième - de navires à deux cellules, etc.
Par exemple, la liste [4,1,2,0,1]
créerait l’ensemble de navires suivant:
Lorsqu'ils sont placés sur le champ de bataille, les navires ne peuvent pas se croiser ni même se toucher. Pas même avec les coins. Ils peuvent cependant toucher les bords du champ.
Vous trouverez ci-dessous un exemple de placement de navire valide:
Vous pouvez supposer que pour un ensemble de navires donné, il existe toujours un emplacement sur un tableau vide de taille donnée.
Sortie
Si de tels emplacements de navires existent, vous devez en générer un.
Le programme doit générer une matrice de caractères ascii séparés de 3 nouvelles lignes, une pour indiquer une cellule vide, une autre pour une pièce de navire et une autre pour une cellule marquée comme "manquante". Aucun autre caractère ne doit être sorti.
Par exemple,
ZZ@Z
\@@Z
@\\Z
\Z\\
(Dans cet exemple, j'ai défini @
être une cellule vide, \
une cellule "manquée" et Z
une pièce du navire)
Si ce type de placement n'existe pas, le programme / la fonction doit revenir sans rien générer.
Contribution
Si vous décidez de créer un programme complet, c'est à vous de spécifier comment les listes sont entrées, certaines peuvent passer par des arguments, d'autres via stdin.
C'est le code-golf , le plus petit nombre de personnages gagne.
Vous trouverez ici un exemple de solution optimisée sans golf .
Compilez avec -std=c99
, le premier argument est la taille du tableau, les autres arguments sont les tailles de navire. Une liste de plans séparés par une nouvelle ligne est donnée sur stdin. Exemple:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
un ensemble de 4,3,2,1
navires
26x26
? J'ai esquissé une solution basée sur les expressions rationnelles et la récursivité, et elle devient extrêmement lente = inutilisable pour les champs plus que6x6
. Soit je fais quelque chose de très stupide, ou le manque de réponses signifie que les autres n'ont pas de succès aussi.