Проблема N-Queens [закрыто]

9

В шахматах королева может двигаться так далеко, как доска проходит горизонтально, вертикально или по диагонали.

Учитывая шахматную доску размером NxN, распечатайте, сколько возможных позиций N королев может быть размещено на доске и не сможет ударить друг друга за 1 ход.

Дэн МакГрат
источник
Нужно ли обрабатывать 2 <= N <= 4 случая? Если так, то как?
st0le
Для случая нет решения: N = 2,3. В википедии есть отличная статья об этой классической проблеме. Он хорошо документирует номер решения от N = 1 до N = 14. (Я все еще новичок в Code Golf. Не уверен, что лучший способ участвовать пока :))
Dongshengcn
A000170
Питер Тейлор

Ответы:

4

Вот решение (первоначально из этой записи в блоге ), где я строю логическое описание решения в конъюнктивной нормальной форме, которое затем решается 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

Вот вывод:

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
nibot
источник
0

Рубин

Я не вижу golfтега, поэтому я предполагаю, что это просто вызов.

Вот реализация Алгоритма, упомянутого в Википедии. Это не я, это в Rosetta Stone и можно найти здесь

CommWikied этот ответ.

st0le
источник
0

Python 2, 190 185 символов

из itertools import *
п = вход ()
print len ​​(фильтр (лямбда x: все (1 ^ (y в (z, z + ij, z-i + j)) для i, y в перечислении (x) для j, z в перечислении (x [: i] + (1e9) + х [I + 1:])) перестановок (диапазон (1, п + 1), п)))

Я просто принял кодовый тег для гольфа, хотя его там не было. N считывается из стандартного ввода, программа рассчитывает решения до n = 10 в приемлемое время.

cemper93
источник
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() 
}

Предоставляет список всех решений queen:

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

Для графического представления добавьте:

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

который выглядит так:

|_|Q|_|_|_|_|_|_|
|_|_|_|Q|_|_|_|_|
|_|_|_|_|_|Q|_|_|
|_|_|_|_|_|_|_|Q|
|_|_|Q|_|_|_|_|_|
|Q|_|_|_|_|_|_|_|
|_|_|_|_|_|_|Q|_|
|_|_|_|_|Q|_|_|_|
Джонас Эйкер
источник