ปัญหาของ N-Queens [ปิด]


9

ในหมากรุกราชินีสามารถเคลื่อนที่ได้ไกลที่สุดเท่าที่กระดานจะขยายออกไปในแนวนอนแนวตั้งหรือแนวทแยงมุม

ให้กระดานหมากรุกขนาด NxN พิมพ์จำนวนตำแหน่งที่เป็นไปได้ที่ N ควีนสามารถวางบนกระดานและไม่สามารถโจมตีซึ่งกันและกันได้ใน 1 ครั้ง


เราจำเป็นต้องจัดการ 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แท็กดังนั้นฉันจึงคิดว่ามันเป็นแค่ความท้าทาย

นี่คือการใช้อัลกอริทึมที่กล่าวถึงใน Wikipedia ไม่ใช่โดยฉันมันอยู่ที่ Rosetta Stone และสามารถพบได้ที่นี่

CommWikied คำตอบนี้


0

Python 2, 190 185 ตัวอักษร

จากการนำเข้า itertools *
n = อินพุท ()
พิมพ์ len (ตัวกรอง (แลมบ์ดา x: ทั้งหมด (1 ^ (y in (z, z + ij, z-i + j))) สำหรับ i, y ใน enumerate (x) สำหรับ j, z ในการแจกแจง (x [: i] + (1e9) + x [i + 1:])) พีชคณิต (ช่วง (1, 1 + n) 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|_|_|_|
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.