Câu đố N-Queens


17

(Mặc dù có hơn 60 câu hỏi được gắn thẻ , chúng tôi không có thử thách đơn giản với nữ hoàng.)

Trong cờ vua, Câu đố N-Queens được mô tả như sau: Đưa ra một n x nbàn cờ và các nnữ hoàng, sắp xếp các nữ hoàng lên bàn cờ để không có hai nữ hoàng nào đe dọa nhau. Dưới đây là một giải pháp ví dụ cho n = 8, mượn từ Wikipedia.

Giải pháp ví dụ 8 nữ hoàng từ Wikipedia

Hoặc, trong kết xuất ASCII:

xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx

Thách thức ở đây sẽ là đưa đầu vào nvà đầu ra một đại diện ASCII của một giải pháp cho ncâu đố -Queens. Vì có nhiều hơn một giải pháp khả thi (ví dụ: ít nhất là xoay hoặc phản xạ), mã của bạn chỉ cần xuất bất kỳ giải pháp hợp lệ nào.

Đầu vào

Một số nguyên dương duy nhất nvới n >= 4 bất kỳ định dạng thuận tiện . (n = 2 và n = 3 không có giải pháp và n = 1 là tầm thường, vì vậy những cái đó bị loại trừ)

Đầu ra

Kết quả đại diện ASCII của một giải pháp cho câu đố N-nữ hoàng, như đã nêu ở trên. Bạn có thể chọn bất kỳ hai giá trị ASCII riêng biệt nào để thể hiện các khoảng trắng và kiến ​​trúc trống. Một lần nữa, đây có thể là đầu ra ở bất kỳ định dạng phù hợp (chuỗi đơn, danh sách các chuỗi, mảng ký tự, v.v.).

Quy tắc

  • Các dòng mới hoặc dấu cách hàng đầu hoặc dấu trắng đều là tùy chọn, cũng như khoảng trắng giữa các ký tự, miễn là bản thân các ký tự xếp hàng chính xác.
  • Bạn có thể sử dụng thuật toán để tính toán các vị trí có thể hoặc sử dụng kiểu giải pháp "bậc thang" rõ ràng, tùy theo trường hợp nào là mã cho mã của bạn.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

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
Bạn có thể cung cấp cho testcase cho đầu vào lẻ?
Kritixi Lithos

@Cowsquack Đã thêm n = 7 ví dụ
admBorkBork

1
@KeyuGan Một cái gì đó giống như câu trả lời MATL? Yeah, được thôi.
admBorkBork

2
@Jonathan ALLan Không có loại trừ nào được dự định, miễn là chương trình kết thúc trong thời gian hữu hạn với xác suất thứ nhất (là tiêu chuẩn cho tất cả các lần gửi).
admBorkBork

Câu trả lời:


5

MATL , 33 32 27 byte

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

Hãy thử trực tuyến!

Lực lượng bán tàn bạo, phương pháp không xác định:

  1. Tạo một hoán vị ngẫu nhiên của các vị trí hàng
  2. Tạo một hoán vị ngẫu nhiên của các vị trí cột
  3. Kiểm tra xem không có nữ hoàng nào chia sẻ đường chéo hoặc đường chéo
  4. Lặp lại nếu cần thiết.

Các giải pháp thu được là ngẫu nhiên. Nếu bạn chạy lại mã, bạn có thể nhận được một cấu hình hợp lệ khác. Thời gian chạy cũng là ngẫu nhiên, nhưng trường hợp thử nghiệm dài nhất ( n = 10) kết thúc sau khoảng 30 giây trong TIO hầu hết thời gian.


Tôi không chắc đây là một giải pháp, vì nó không phải lúc nào cũng đưa ra câu trả lời đúng.
Junkmail

1
@ Quânkmail Hả? Không có những điều như những có câu trả lời đúng, như một số giải pháp (như đã nêu bởi thách thức). Mã luôn đưa ra một câu trả lời đúng, chỉ là không giống nhau mỗi lần
Luis Mendo

Về mặt lý thuyết, chương trình có thể chạy tùy ý nhiều lần mà vẫn không đưa ra câu trả lời.
Junkmail

1
@junkmail Nhưng nó kết thúc trong thời gian hữu hạn với xác suất thứ nhất
Luis Mendo

1
@JamesHollis Tôi không đồng ý. Điều đó có thể làm cho một số hoán vị có nhiều khả năng hơn các hoán vị khác, nhưng nó sẽ không ngăn cản bất kỳ hoán vị nào xuất hiện. Vì vậy, giải pháp cuối cùng sẽ đạt được. Và ngoài ra, giả sử trình tạo ngẫu nhiên là lý tưởng thường được chấp nhận
Luis Mendo

5

C, 114 byte

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

Trực tiếp in một giải pháp trong thời gian O (1).


1
Tôi không rõ làm thế nào nó có thể là O (1) với một vòng lặp lặp lại n lần. Làm thế nào tất cả những tính toán đó luôn luôn được thực hiện trong thời gian liên tục?
poi830

1
@ poi830 Ý tôi là thời gian tính toán O (1) trên mỗi hàng để xác định vị trí của nữ hoàng.
orlp

bạn không thể tiết kiệm một vài bằng cách tạo một biến mới cho n/2?
Jeffmagma

Đề xuất n-=o=n%2;for(y=n+o;y--;)thay vìo=n%2;n-=o;for(y=0;y<n+o;++y)
trần

2

Toán học, 103 108 110 117 byte

-5 byte cho DuplicateFreeQ->E!=##&@@@

-7 byte cho ReplacePart[Array[],]->SparseArray[]

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

Trả về một mảng 2D. Phải mất 2,76 giây để tính toán f[6]và 135 giây cho f[7]. (Trong phiên bản hiện tại, -trở thành 0Qđể 1.

đầu ra

Thuật toán tương tự như câu trả lời MATL nhưng ở đây mã hoàn toàn mạnh mẽ.


1

C - 222 byte

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]);}

Mã này không phải của tôi, mà là từ IOCCC . Tôi hy vọng tôi không vi phạm bất kỳ quy tắc nào. Ngoài ra, điều này sẽ hiển thị tất cả các giải pháp cho N trong khoảng từ 4 đến 99. Tôi sẽ cố gắng để có được liên kết TIO sau.


Vì mã này không phải của bạn, bạn có thể chuyển đổi nó thành Cộng đồng Wiki không? (chỉ cần nhấp vào nút bên dưới cửa sổ chỉnh sửa có nội dung "Cộng đồng Wiki")
caird coinheringaahing

Xin chào QuaerendoInvenietis và chào mừng bạn đến với PPCG. Như hiện tại nó được viết, điều này dường như không lấy một số cụ thể làm đầu vào và đầu ra chỉ là giải pháp đó.
admBorkBork

1

Thạch , 24 21 byte

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

Hãy thử trực tuyến!

Giả sử mỗi nữ hoàng được đặt trên các hàng riêng biệt, chúng ta chỉ cần tìm các chỉ số cột để đặt từng nữ hoàng để tránh xung đột, có thể được tìm thấy bằng cách tạo ra một hoán vị ngẫu nhiên [1, 2, ..., n]và kiểm tra nó.

Giải trình

,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

Bạn không thể sử dụng Œc€thay vì œc€2cho -1?
Erik the Outgolfer 22/07/17

1

Python 3, 204 189 byte

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

Lực lượng tìm kiếm thông qua tất cả các hoán vị. Tôi có thể loại bỏ dấu * và in các danh sách hiểu, nhưng chúng trông khủng khiếp.

Đầu ra:

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

Hơi vô dụng:

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 byte

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

Hãy thử trực tuyến!

Điều này ít nhiều dựa trên giải pháp C của orlp .

Giải trình

Mã nguồn với các đường dẫn thực thi được tô sáng

*Đọc số lượng nữ hoàng, q , từ stdin và tính hai biến để sử dụng sau: n = q - q%2hn = n/2
*Bắt đầu vòng lặp chính, lặp lại r , số hàng, từ q xuống 0, giảm dần ở đầu vòng lặp, vì vậy r đầu tiên là q trừ 1.
*Tính phần bù của nữ hoàng trong mỗi hàng với công thức sau:

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

*Các ký tự không gian đầu ra để thụt vào vị trí của nữ hoàng cho hàng hiện tại, cộng với một khoảng trắng bổ sung chỉ vì nó làm cho vòng lặp đầu ra dễ dàng hơn.
*Xuất ra Qcho nữ hoàng, theo sau là một dòng mới để chuyển sang hàng tiếp theo.
*Kiểm tra xem r có bằng 0 không, trong trường hợp đó chúng ta đã đến cuối bảng và có thể thoát ra, nếu không chúng ta lặp lại vòng lặp chính.



0

Võng mạc , 136 byte

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

Hãy thử trực tuyến! Câu trả lời C tuyệt vời của cảng @ orlp. Giải trình:

.+
$* 

Chuyển đổi sang unary, sử dụng khoảng trắng (có khoảng trắng sau dấu *).

$_;$`Q¶

Tạo Ncác hàng có Nkhoảng trắng, a ;, rồi 0..N-1khoảng trắng, sau đó a Q. Các giai đoạn còn lại áp dụng cho tất cả các hàng.

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

Số nguyên chia Ncho 2. (Cũng bọc kết quả vào :;để dễ dàng neo mẫu hơn.)

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

Nếu chỉ số vòng lặp bằng N/2*2, thì chỉ cần để lại nhiều khoảng trống.

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

Nếu N/2là bội số của 3, thì lấy gấp đôi chỉ số vòng lặp cộng với một, modulo N/2*2+1.

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

Mặt khác, lấy gấp đôi chỉ số vòng lặp cộng (N/2-1)với thêm 3 ở nửa dưới của bảng, modulo N/2*2.

( +)%\1?

Thực tế thực hiện các hoạt động modulo.


0

Than , 44 byte

Nθ≔÷θ²ηEθ◧Q⊕⎇⁼ι⊗ηι⎇﹪η³﹪⁺⁺⊗ι⊖η׳¬‹ιη⊗η﹪⊕⊗ι⊕⊗η

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Một cổng khác của câu trả lời C xuất sắc của @ orlp.


0

APL (Dyalog Unicode) , 18 byte SBCS

Chương trình đầy đủ nhắc nhở ntừ stdin. In giải pháp phân tách không gian vào thiết bị xuất chuẩn bằng cách sử dụng ·cho các ô vuông trống và cho Nữ hoàng.

CY'dfns'
queens

Hãy thử trực tuyến!

⎕CY'dfns'C op y thư viện "dfns"

 nhận đầu vào từ stdin

queens tìm tất cả các giải pháp thực sự độc đáo của Nữ hoàng (không có phản xạ hoặc xoay)

 chọn giải pháp đầu tiên


0

J , 49 byte

i.=/0({(1-.@e.,)@(([:(=#\){.|@-}.)\."1)#])!A.&i.]

Hãy thử trực tuyến!

Lực lượng vũ phu bằng cách kiểm tra tất cả các hoán vị của chiều dài n .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.