N- 퀸즈 문제 [폐쇄]


9

체스에서 여왕은 보드가 가로, 세로 또는 대각선으로 확장되는 한 움직일 수 있습니다.

NxN 크기의 체스 판이 주어지면 N 퀸이 보드에 놓일 수 있고 가능한 한 많은 위치를 한 번에 칠 수 없습니다.


2 <= N <= 4 건을 처리해야합니까? 그렇다면 어떻게?
st0le

경우에 대한 해결책은 없습니다 : N = 2,3. 위키 백과에는이 고전적인 문제에 대한 훌륭한 글이 있습니다. 그것은에 솔루션 N에서 수 = 1에 대한 버전 잘 문서화 N = 14 (I 코드 골프 여전히 새로운 오전 확실하지 아직 참여하는 가장 좋은 방법은 무엇입니까 :..)
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

파이썬 2, 190 185 자

itertools에서 가져 오기 *
n = 입력 ()
print len ​​(filter (lambda x : all (1 ^ (y in (z, z + ij, z-i + j))) i, y 열거 형 (x) j, z 열거 형 (x [: i] + (1e9,) + x [i + 1 :])), 순열 (범위 (1, n + 1), n)))

코드 골프 태그가없는 경우에도 방금 코드 골프 태그를 가정했습니다. stdin에서 N을 읽으면 프로그램은 허용 가능한 시간에 최대 n = 10의 솔루션을 계산합니다.


0

그루비

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.