Головоломка N-Queens


17

(Незважаючи на 60+ питань, позначених , у нас немає простого завдання n-queens.)

У шахах головоломка N-Queens описується так: n x nДавши шахову дошку та nкоролеви, розташуйте королеви на шаховій дошці так, щоб жодні дві королеви не загрожували одне одному. Нижче наведено приклад рішення для n = 8, запозичене з Вікіпедії.

Приклад рішення 8-цариць з Вікіпедії

Або в ASCII візуалізації:

xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx

Завданням буде полягати у введенні nта виведенні ASCII подання рішення на nголоволомку -Queens. Оскільки існує декілька можливих рішень (наприклад, принаймні, обертання або відображення), для вашого коду потрібно лише вивести будь-яке дійсне рішення.

Вхідні дані

Один натуральне число nз n >= 4 в будь-якому зручному форматі . (n = 2 і n = 3 не мають розв’язків, і n = 1 є тривіальним, тому вони виключаються)

Вихідні дані

Отримане ASCII представлення рішення для головоломки N-queens, як зазначено вище. Ви можете вибрати будь-які два різних значення ASCII для представлення порожніх пробілів і маток. Знову ж таки, це може бути виведено у будь-якому відповідному форматі (одна рядок, список рядків, масив символів тощо).

Правила

  • Провідні чи кінцеві рядки чи пробіли - це необов’язково, а також пробіл між символами, якщо вони самі правильно вибудовуються.
  • Ви можете або використовувати алгоритм для обчислення можливих позицій, або використовувати чіткий стиль рішення "сходовий крок" рішення, залежно від того, хто є гравцем для вашого коду.
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Якщо можливо, додайте посилання на онлайн-тестувальне середовище, щоб інші люди могли спробувати ваш код!
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Приклади

n=4
xQxx
xxxQ
Qxxx
xxQx

n=7
xxQxxxx
xxxxxxQ
xQxxxxx
xxxQxxx
xxxxxQx
Qxxxxxx
xxxxQxx

n=10
xxxxQxxxxx
xxxxxxxxxQ
xxxQxxxxxx
xxxxxxxxQx
xxQxxxxxxx
xxxxxxxQxx
xQxxxxxxxx
xxxxxxQxxx
Qxxxxxxxxx
xxxxxQxxxx


1
Чи можете ви дати тестові вітрини для непарних входів?
Kritixi Lithos

@Cowsquack Додано n = 7 приклад
AdmBorkBork

1
@KeyuGan Щось на зразок відповіді MATL? Так, це добре.
AdmBorkBork

2
@JonathanAllan Такого виключення не передбачалося, доки програма закінчується в обмежений час з ймовірністю один (як стандарт для всіх публікацій).
AdmBorkBork

Відповіді:


5

MATL , 33 32 27 байт

`x,GZ@]1Z?tt!P!,w&TXds]h1>a

Спробуйте в Інтернеті!

Напівгруба сила, недетермістичний підхід:

  1. Створіть випадкову перестановку позицій рядків
  2. Створіть випадкову перестановку позицій стовпців
  3. Переконайтеся, що жодна королева не ділиться на діагональ або антидіагональ
  4. Повторіть, якщо потрібно.

Отримане рішення є випадковим. Якщо ви знову запустите код, ви можете отримати іншу дійсну конфігурацію. Час запуску також випадковий, але найдовший тестовий випадок ( n = 10) закінчується приблизно за 30 секунд у TIO більшу частину часу.


Я не впевнений, що це вважається рішенням, враховуючи, що воно не завжди дає правильну відповідь.
небажана пошта

1
@junkmail Так? Там немає такого поняття , як на правильну відповідь, так як там кілька рішень (як зазначено на виклик). Код завжди дає більш правильну відповідь, тільки не те ж саме кожен раз
Luis Mendo

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

1
@junkmail Але це закінчується в кінцевий час з вірогідністю один
Луїс Мендо

1
@JamesHollis Я не згоден. Це може зробити деякі перестановки більш імовірними, ніж інші, але це не завадить появі перестановки. Тож рішення врешті-решт буде досягнуто. А крім того, припустимо, що випадковий генератор є ідеальним, як правило, прийнято
Луїс Мендо

5

C, 114 байт

Q(n,o,y){o=n%2;n-=o;for(y=0;y<n+o;++y)printf("%*c\n",y<n?o+n-(n+y%(n/2)*2+(n%6?y<n/2?n/2-1:2-n/2:y<n/2))%n:0,81);}

Безпосередньо друкує рішення за O (1) час.


1
Мені не ясно, як це може бути O (1) з циклом, що повторюється n разів. Як усі ці розрахунки можна робити постійно?
poi830

1
@ poi830 Я маю на увазі час обчислення O (1) для ряду, щоб визначити положення королеви.
orlp

Ви не могли зберегти декілька, створивши нову змінну для n/2?
Jeffmagma

Запропонувати n-=o=n%2;for(y=n+o;y--;)замістьo=n%2;n-=o;for(y=0;y<n+o;++y)
roofcat

2

Математика, 103 108 110 117 байти

-5 байт для DuplicateFreeQ->E!=##&@@@

-7 байт для ReplacePart[Array[],]->SparseArray[]

SparseArray[Thread@#&@@Select[Permutations@Range@#~Tuples~2,And@@(E!=##&@@@{#-#2,+##})&@@#&]->1,{#,#}]&

Повернути 2D-масив. Для розрахунку потрібно 2,76, f[6]а для - 135 f[7]. (У поточній версії -стає 0і Qдо 1.

output

Алгоритм схожий на відповідь MATL, але тут код повністю жорстокий.


1

C - 222 байти

v,i,j,k,l,s,a[99];main(){for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j<s&&(!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j)&1:2])&&++l||a[i]<s&&v&&v-i+j&&v+i-j))&&!(l%=s),v||(i==j?a[i+=k]=0:++a[i])>=s*k&&++a[--i]);}

Код не мій, а від IOCCC . Сподіваюся, я не порушую жодних правил. Також тут відображаються всі рішення для N між 4 і 99. Я спробую пізніше отримати TIO-посилання.


Оскільки цей код не ваш, чи можете ви перетворити його у спільноту Wiki? (просто натисніть кнопку під вікном редагування, на якій написано "Community Wiki")
caird coinheringaahing

Привіт QuaerendoInvenietis та ласкаво просимо до PPCG. Як написано в даний час, схоже, це не приймає певне число як вхід і вихід тільки цього рішення.
AdmBorkBork

1

Желе , 24 21 байт

,JŒc€IF€An/PC
ẊÇ¿=þRG

Спробуйте в Інтернеті!

Припускаючи, що кожну королеву розміщують в окремі рядки, нам потрібно лише знайти індекси стовпців, щоб розмістити кожну королеву, щоб уникнути конфліктів, які можна знайти, генеруючи випадкову перестановку [1, 2, ..., n] та тестуючи її.

Пояснення

,JŒc€IF€An/PC  Helper. Input: permutation of [1, 2, ..., n]
 J             Enumerate indices, obtains [1, 2, ..., n]
,              Join
  Œc€          Find all pairs in each
     I         Calculate the difference of each pair
      F€       Flatten each
        A      Absolute value
               (We now have the distance in column between each queen and
                the distance in rows between each queen. If they are unequal,
                the queens do not conflict with each other)
         n/    Reduce using not-equals
           P   Product, returns 1 only if they are all unequal
            C  Complement
               Returns 1 when there is a conflict, else 0

ẊÇ¿=þRG  Main.  Input: n
Ẋ        Shuffle (When given an integer, it will shuffle [1, 2, ..., n])
 Ç¿      While the helper returns 1, continue shuffling
     R   Range, gets [1, 2, ..., n]
   =þ    Equality table (Generates the board as a matrix)
      G  Pretty-print the matrix

Не можете використовувати Œc€замість œc€2-1?
Erik the Outgolfer

1

Пітон 3, 204 189 байт

import itertools as p
n=int(input())
r=range(n)
b='.'*(n-1)+'Q'
for c in p.permutations(r):
 if len(set((x*z+c[x],z)for x in r for z in[1,-1]))==n+n:[print(*(b[x:]+b[:x]))for x in c];break

Брутальний пошук через усі перестановки. Я міг би видалити * та роздрукувати розуміння списку, але вони виглядають жахливо.

Вихід:

10
Q . . . . . . . . .
. . Q . . . . . . .
. . . . . Q . . . .
. . . . . . . Q . .
. . . . . . . . . Q
. . . . Q . . . . .
. . . . . . . . Q .
. Q . . . . . . . .
. . . Q . . . . . .
. . . . . . Q . . .

Трохи незворушений:

import itertools as p
n=int(input())
r=range(n)
b='.'*(n-1)+'Q'
for c in p.permutations(r):
    if len(set( (x*z+c[x],z) for x in r for z in[1,-1] )) == n+n:
        [print(*(b[x:] + b[:x])) for x in c]
        break

1

Befunge, 122 байти

&::2%-v>2*00g++00g%00g\-\00g\`*4>8#4*#<,#-:#1_$55+"Q",,:#v_@
/2p00:<^%g01\+*+1*!!%6g00-2g01\**!!%6g00-g012!:`\g01:::-1<p01

Спробуйте в Інтернеті!

Це більш-менш ґрунтується на розчині C від orlp .

Пояснення

Вихідний код із виділеними шляхами виконання

*Прочитайте кількість маток, q , від stdin та обчисліть дві змінні для подальшого використання: n = q - q%2і hn = n/2
*Почніть головну петлю, повторюючи r , номер рядка, від q до 0, зменшення на початку циклу, тому перший r є q мінус 1.
*Обчисліть зміщення королеви в кожному ряду за такою формулою:

offset = (n - (
  (hn <= r) * (2 - hn) * !!(n % 6) + 
  (hn > r) * ((hn - 2) * !!(n % 6) + 1) + 
  (y % hn * 2) + n
) % n) * (n > r)

*Виведіть зсувні символи пробілу для відступу позиції королеви для поточного ряду плюс один додатковий простір лише тому, що це полегшує вихідний цикл.
*Виведіть значення Qдля королеви, а потім новий рядок, щоб перейти до наступного ряду.
*Тест , якщо г дорівнює нулю, в цьому випадку ми досягли кінця дошки і може вийти, в іншому випадку ми знову повторити основний цикл.



0

Сітківка , 136 байт

.+
$* 
 
$_;$`Q¶
( +)\1( ?);
:$1;
:( +);\1\1
$1$1
:((   )+);( *)
 $1$1% $3$3
: ( +);( \1)?( *)
 $1 $1%$#2$* $#2$* $#2$* $1$3$3
( +)%\1?

Спробуйте в Інтернеті! Відмінний відповідь на порту @ orlp. Пояснення:

.+
$* 

Перетворити в одинарне, використовуючи пробіли (після пробілу є пробіл *).

$_;$`Q¶

Створіть Nрядки з Nпробілами, a ;, потім 0..N-1пробілами, потім a Q. Решта етапів стосуються всіх рядів.

( +)\1( ?);
:$1;

Ціле число поділіть Nна 2. (Також оберніть результат, :;щоб було легше прив’язувати візерунки.)

:( +);\1\1
$1$1

Якщо індекс циклу дорівнює N/2*2, просто залиште стільки пробілів.

:((   )+);( *)
 $1$1% $3$3

Якщо N/2кратне 3, то візьміть подвійний показник циклу плюс один, модуль N/2*2+1.

: ( +);( \1)?( *)
 $1 $1%$#2$* $#2$* $#2$* $1$3$3

В іншому випадку візьміть подвійний показник циклу плюс (N/2-1)додаткові 3 в нижній половині дошки, модуль N/2*2.

( +)%\1?

Фактично виконайте модульну операцію.



0

APL (Dyalog Unicode) , 18 байт SBCS

Повна програма, що вимагає nвід stdin. Друкує розділене місцем рішення для stdout, використовуючи ·порожні квадрати та для королеви.

CY'dfns'
queens

Спробуйте в Інтернеті!

⎕CY'dfns'C op y бібліотека "dfns"

 отримати вхід від stdin

queens знайти усі справді унікальні рішення Queens (без роздумів чи поворотів)

 виберіть перше рішення


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