Problème N-Queens [fermé]


9

Aux échecs, une reine peut se déplacer aussi loin que le plateau s'étend horizontalement, verticalement ou en diagonale.

Étant donné un échiquier de taille NxN, imprimez combien de positions possibles N reines peuvent être placées sur le plateau et ne pas pouvoir se frapper en un seul mouvement.


Avons-nous besoin de gérer 2 <= N <= 4 cas? Si c'est le cas, comment?
st0le

Il n'y a pas de solution pour le cas: N = 2,3. Le wikipedia a une excellente écriture sur ce problème classique. Il documente très bien le numéro de solution de N = 1 à N = 14. (Je suis encore nouveau sur Code Golf. Je ne sais pas encore quelle est la meilleure façon de participer. :))
Dongshengcn

Réponses:


4

Voici une solution (à l'origine de cette entrée de blog ) où je construis une description logique de la solution sous forme normale conjonctive qui est ensuite résolue par Mathematica:

(* 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

Voici la sortie:

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

Rubis

Je ne vois pas de golfbalise, donc je suppose que c'est juste un défi.

Voici une implémentation de l'algorithme mentionné sur Wikipedia. Ce n'est pas par moi, c'est à Rosetta Stone et peut être trouvé ici

CommWikied cette réponse.


0

Python 2, 190 185 caractères

depuis itertools import *
n = entrée ()
print len ​​(filter (lambda x: all (1 ^ (y in (z, z + ij, z-i + j)) for i, y in enumerate (x) for j, z in enumerate (x [: i] + (1e9,) + x [i + 1:])), permutations (plage (1, n + 1), n)))

Je viens de supposer le code golf tag même s'il n'était pas là. N est lu à partir de stdin, le programme calcule des solutions jusqu'à n = 10 dans un temps acceptable.


0

Sensationnel

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() 
}

Fournit une liste de toutes les solutions reine comme celle-ci:

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

Pour la représentation graphique, ajoutez:

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

qui ressemble à ceci:

|_|Q|_|_|_|_|_|_|
|_|_|_|Q|_|_|_|_|
|_|_|_|_|_|Q|_|_|
|_|_|_|_|_|_|_|Q|
|_|_|Q|_|_|_|_|_|
|Q|_|_|_|_|_|_|_|
|_|_|_|_|_|_|Q|_|
|_|_|_|_|Q|_|_|_|
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.