Vấn đề N-Queens [đã đóng]


9

Trong cờ vua, một nữ hoàng có thể di chuyển xa như tấm ván kéo dài theo chiều ngang, chiều dọc hoặc đường chéo.

Đưa ra một bàn cờ có kích thước NxN, in ra có thể đặt bao nhiêu vị trí N nữ hoàng trên bàn cờ và không thể đánh nhau trong 1 lần di chuyển.


Chúng ta có cần xử lý 2 <= N <= 4 trường hợp không? Nếu vậy thì thế nào?
st0le

Không có giải pháp cho trường hợp: N = 2,3. Các wikipedia có một bài viết tuyệt vời về vấn đề cổ điển này. Tài liệu này xác nhận rõ về số giải pháp từ N = 1 đến N = 14. (Tôi vẫn chưa quen với Code Golf. Không chắc cách nào là tốt nhất để tham gia. :))
Dongshengcn

Câu trả lời:


4

Đây là một giải pháp (ban đầu từ mục blog này ) trong đó tôi xây dựng một mô tả logic của giải pháp ở dạng bình thường kết hợp, sau đó được Mathicala giải quyết:

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

Đây là đầu ra:

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

Hồng ngọc

Tôi không thấy golfthẻ, vì vậy tôi cho rằng đó chỉ là một thử thách.

Đây là một triển khai của Thuật toán được đề cập trên Wikipedia. Không phải tôi, nó ở Rosetta Stone và có thể tìm thấy ở đây

CommWikied Câu trả lời này.


0

Python 2, 190 185 ký tự

từ nhập itertools *
n = đầu vào ()
in len (bộ lọc (lambda x: all (1 ^ (y in (z, z + ij, z-i + j)) cho i, y trong liệt kê (x) cho j, z trong liệt kê (x [: i] + (1e9,) + x [i + 1:])), hoán vị (phạm vi (1, n + 1), n)))

Tôi chỉ giả sử thẻ golf mã mặc dù nó không có ở đó. N được đọc từ stdin, chương trình tính toán các giải pháp lên đến n = 10 trong thời gian chấp nhận được.


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

Cung cấp một danh sách tất cả các giải pháp nữ hoàng như thế này:

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

Đối với biểu diễn đồ họa thêm:

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

trông như thế này:

|_|Q|_|_|_|_|_|_|
|_|_|_|Q|_|_|_|_|
|_|_|_|_|_|Q|_|_|
|_|_|_|_|_|_|_|Q|
|_|_|Q|_|_|_|_|_|
|Q|_|_|_|_|_|_|_|
|_|_|_|_|_|_|Q|_|
|_|_|_|_|Q|_|_|_|
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.