Stellen Sie sich folgendes Szenario vor: Sie spielen Schlachtschiffe mit einem Freund, entscheiden sich aber zu betrügen. Anstatt ein Schiff zu bewegen, nachdem es an der Stelle geschossen hat, an der sich Ihr Schiff befand, beschließen Sie, überhaupt keine Schiffe zu platzieren. Sie sagen ihm, dass alle seine Schüsse Fehlschüsse sind, bis es unmöglich ist, Schiffe so zu platzieren.
Sie müssen eine Funktion oder ein vollständiges Programm schreiben, das irgendwie drei Argumente akzeptiert: die Feldgröße, eine Liste der Schiffsgrößen und eine Liste der Schüsse.
Schlachtfeld
Einer der angegebenen Parameter ist die Kartengröße. Das Schlachtfeld ist ein Quadrat aus Zellen, und der angegebene Parameter ist einfach eine Seite des Quadrats.
Das folgende Beispiel ist eine Tafel der Größe 5.
Koordinaten auf dem Feld werden als 2-Komponenten-Zeichenfolge angegeben: ein Buchstabe, gefolgt von einer Zahl. Sie können sich darauf verlassen, dass die Buchstaben in einem bestimmten Fall sind.
Buchstabe gibt die Spalte an, Zahl die Zeile der Zelle (1-indiziert). Im obigen Bild ist die hervorgehobene Zelle beispielsweise mit gekennzeichnet "D2"
.
Da es nur 26 Buchstaben gibt, kann das Feld nicht größer als 26x26 sein.
Schiffe
Die Schiffe sind gerade Linien von 1 oder mehr Blöcken. Die Anzahl der Schiffe wird in einer Liste angegeben, wobei das erste Element die Anzahl der 1-Zellen-Schiffe, das zweite die Anzahl der 2-Zellen-Schiffe usw. ist.
Beispielsweise [4,1,2,0,1]
würde die Liste die folgende Schiffsgruppe erstellen:
Schiffe, die sich auf dem Schlachtfeld befinden, können sich nicht kreuzen oder sogar berühren. Nicht einmal mit Ecken. Sie können jedoch die Ränder des Feldes berühren.
Unten sehen Sie ein Beispiel für eine gültige Schiffsplatzierung:
Sie können davon ausgehen, dass für eine bestimmte Schiffsgruppe immer eine Platzierung auf einem leeren Brett einer bestimmten Größe vorhanden ist.
Ausgabe
Wenn solche Platzierungen von Schiffen existieren, müssen Sie eine von ihnen ausgeben.
Das Programm muss eine durch Zeilenumbrüche getrennte Matrix von ASCII-Zeichen eines von drei Typen ausgeben - eine, um eine leere Zelle, eine - ein Schiffsstück und eine - eine Zelle, die als "vermisst" markiert ist. Es dürfen keine anderen Zeichen ausgegeben werden.
Zum Beispiel,
ZZ@Z
\@@Z
@\\Z
\Z\\
(In diesem Beispiel habe ich definiert @
, dass es sich um eine leere Zelle, \
eine "verpasste" Zelle und Z
ein Schiffsstück handelt.)
Wenn keine solche Platzierung vorhanden ist, sollte das Programm / die Funktion zurückkehren, ohne etwas auszugeben.
Eingang
Wenn Sie sich für ein vollwertiges Programm entscheiden, müssen Sie angeben, wie die Listen eingegeben werden. Einige können über Argumente, andere über stdin erfolgen.
Dies ist Code-Golf , die niedrigste Anzahl an Charakteren gewinnt.
Ein Beispiel für eine nicht für den Golfsport optimierte Lösung finden Sie hier.
Kompilieren Sie mit -std=c99
. Das erste Argument ist die Größe des Bretts. Die anderen Argumente sind Schiffsgrößen. Eine durch Zeilenumbrüche getrennte Liste von Aufnahmen ist auf stdin angegeben. Beispiel:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
mit einem 4,3,2,1
Schiffssatz
26x26
? Ich habe eine Lösung entworfen, die auf regulären Ausdrücken und Rekursionen basiert und die extrem langsam wird = für Felder über unbrauchbar6x6
. Entweder mache ich etwas sehr Dummes, oder fehlende Antworten führen dazu, dass andere ebenfalls keinen Erfolg haben.