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


9

У шахах королева може рухатись настільки, наскільки дошка простягається горизонтально, вертикально або по діагоналі.

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


Чи потрібно обробляти 2 <= N <= 4 випадки? Якщо так, як?
st0le

Немає рішення для випадку: N = 2,3. Вікіпедія чудово написала про цю класичну проблему. Це добре підтверджує номер рішення від N = 1 до N = 14. (Я все ще новачок у Code Golf. Не знаю, який найкращий спосіб брати участь. :))
Dongshengcn

Відповіді:


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

0

Рубін

Я не бачу golfтегів, тому я припускаю, що це просто завдання.

Ось реалізація алгоритму, згаданого у Вікіпедії. Це не я, це у Rosetta Stone і його можна знайти тут

Обміняв цю відповідь.


0

Пітон 2, 190 185 символів

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

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


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

Подає список усіх варіантів королеви на зразок цього:

[ [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|_|_|_|
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.