N-Queens Problem [geschlossen]


9

Im Schach kann sich eine Königin so weit bewegen, wie sich das Brett horizontal, vertikal oder diagonal erstreckt.

Drucken Sie bei einem Schachbrett der Größe NxN aus, wie viele Positionen N Königinnen auf dem Brett platziert werden können und sich nicht in einem Zug gegenseitig schlagen können.


Müssen wir 2 <= N <= 4 Fälle behandeln? Wenn das so ist, wie?
st0le

Für den Fall gibt es keine Lösung: N = 2,3. Die Wikipedia hat eine ausgezeichnete Beschreibung dieses klassischen Problems. Es dokumentiert sehr gut über die Lösungsnummer von N = 1 bis N = 14. (Ich bin noch neu bei Code Golf. Ich bin mir nicht sicher, wie ich am besten teilnehmen kann. :))
Dongshengcn

Antworten:


4

Hier ist eine Lösung (ursprünglich aus diesem Blogeintrag ), in der ich eine logische Beschreibung der Lösung in konjunktiver Normalform konstruiere, die dann von Mathematica gelöst wird:

(* Define the variables: Q[i,j] indicates whether there is a 
   Queen in row i, column j *)
Qs = Array[Q, {8, 8}];

(* Define the logical constraints. *)
problem =
  And[
   (* Each row must have a queen. *)
   And @@ Map[(Or @@ #) &, Qs],
   (* for all i,j: Q[i,j] implies Not[...] *)
   And @@ Flatten[
     Qs /. Q[i_, j_] :>
       And @@ Map[Implies[Q[i, j], Not[#]] &, 
         Cases[Qs, 
          Q[k_, l_] /;
           Not[(i == k) && (j == l)] && (
             (i == k) ||          (* same row *)
                 (j == l) ||          (* same column *)
             (i + j == k + l) ||  (* same / diagonal *)
             (i - j == k - l)),   (* same \ diagonal *)
          2]]]];

(* Find the solution *)
solution = FindInstance[problem, Flatten[Qs], Booleans] ;

(* Display the solution *)
Qs /. First[solution] /. {True -> Q, False -> x} // MatrixForm

Hier ist die Ausgabe:

x   x   x   x   Q   x   x   x
x   Q   x   x   x   x   x   x
x   x   x   Q   x   x   x   x
x   x   x   x   x   x   Q   x
x   x   Q   x   x   x   x   x
x   x   x   x   x   x   x   Q
x   x   x   x   x   Q   x   x
Q   x   x   x   x   x   x   x

0

Rubin

Ich sehe kein golfTag, also gehe ich davon aus, dass es nur eine Herausforderung ist.

Hier ist eine Implementierung des auf Wikipedia erwähnten Algorithmus. Es ist nicht von mir, es ist bei Rosetta Stone und kann hier gefunden werden

CommWikied diese Antwort.


0

Python 2, 190 185 Zeichen

aus itertools importieren *
n = Eingabe ()
print len ​​(Filter (Lambda x: alle (1 ^ (y in (z, z + ij, z-i + j)) für i, y in Aufzählung (x) für j, z in Aufzählung (x [: i]) + (1e9,) + x [i + 1:])), Permutationen (Bereich (1, n + 1), n)))

Ich habe nur den Code Golf Tag angenommen, obwohl er nicht da war. Wird N aus stdin gelesen, berechnet das Programm Lösungen bis zu n = 10 in akzeptabler Zeit.


0

Groovy

n=8
s=(1..n).permutations().findAll{ 
  def x=0,y=0
  Set a=it.collect{it-x++} 
  Set b=it.collect{it+y++} 
  a.size()==it.size()&&b.size()==it.size() 
}

Liefert eine Liste aller Queen-Lösungen wie folgt:

[ [4, 7, 3, 0, 6, 1, 5, 2], 
  [6, 2, 7, 1, 4, 0, 5, 3], 
  ... ]

Zur grafischen Darstellung hinzufügen:

s.each { def size = it.size()
         it.each { (it-1).times { print "|_" }
                   print "|Q"
                   (size-it).times { print "|_" }
                   println "|"
                 }
         println ""
         }      

das sieht so aus:

|_|Q|_|_|_|_|_|_|
|_|_|_|Q|_|_|_|_|
|_|_|_|_|_|Q|_|_|
|_|_|_|_|_|_|_|Q|
|_|_|Q|_|_|_|_|_|
|Q|_|_|_|_|_|_|_|
|_|_|_|_|_|_|Q|_|
|_|_|_|_|Q|_|_|_|
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.