N- 퀸즈 퍼즐


17

(60 개 이상의 질문에 태그가 지정되었지만 간단한 n- 퀸 도전은 없습니다.)

체스에서 N- 퀸즈 퍼즐 은 다음과 같이 설명됩니다. n x n체스 판과 n여왕이 주어지면 두 여왕이 서로 위협하지 않도록 체스 판에 여왕을 배치하십시오. 다음은 n = 8Wikipedia에서 빌린에 대한 예제 솔루션입니다 .

위키 백과의 8- 여왕 예제 솔루션

또는 ASCII 렌더링에서 :

xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx

여기서 과제 nn-Queens 퍼즐 에 대한 솔루션의 ASCII 표현을 입력 및 출력하는 것입니다. 하나 이상의 가능한 솔루션 (예 : 적어도 회전 또는 반사)이 있으므로 코드는 유효한 솔루션 만 출력하면됩니다.

입력

하나의 양의 정수 nn >= 4 편리한 형식 . (n = 2 및 n = 3에는 솔루션이 없으며 n = 1은 사소하므로 제외됩니다)

산출

위에서 설명한 N- 퀸 퍼즐에 대한 솔루션의 ASCII 표현 결과입니다. 공백과 여왕을 나타내는 두 개의 고유 한 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)는 대부분 TIO에서 약 30 초 안에 완료됩니다.


이것이 항상 올바른 답변을 제공하지는 않는다는 것을 감안할 때 이것이 솔루션으로 계산되는지 확실하지 않습니다.
junkmail

1
@junkmail 허? 같은 것은 없다 정답 등은 (도전에 의해 명시된)는 몇 가지 솔루션이있다. 코드는 항상 제공 , 똑같지는 않습니다마다 정답
루이스 Mendo에게

이론적으로 프로그램이 임의로 여러 번 실행될 수 있으며 여전히 대답을하지 못합니다.
junkmail

1
@junkmail 그러나 그것은 하나의 가능성으로 유한 한 시간 안에 끝납니다
Luis Mendo

1
@JamesHollis 동의하지 않습니다. 이렇게하면 일부 순열이 다른 순열보다 가능성이 높아질 수 있지만 순열이 나타나지는 않습니다. 따라서 해결책에 도달하게됩니다. 또한 랜덤 제너레이터가 이상적이라고 가정하면 일반적으로 허용됩니다.
Luis Mendo

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
n 번 반복되는 루프로 어떻게 O (1) 일 수 있는지는 분명하지 않습니다. 어떻게 모든 계산을 항상 일정한 시간에 수행 할 수 있습니까?
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)
ceilingcat

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]. (현재 버전으로 -된다 0Q한다 1.

산출

알고리즘은 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 에서 가져온 것 입니다. 규칙을 어 기지 않기를 바랍니다. 또한 이것은 4에서 99 사이의 N에 대한 모든 솔루션을 표시합니다. 나중에 TIO 링크를 가져 오려고합니다.


이 코드는 귀하의 코드가 아니므로 커뮤니티 위키로 변환 할 수 있습니까? ( "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

-1 Œc€대신 사용할 수 없습니까 œc€2?
Outgolfer Erik

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

펀드, 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

온라인으로 사용해보십시오!

이것은 orlpC 솔루션 을 기반으로합니다 .

설명

실행 경로가 강조 표시된 소스 코드

*여왕의 수 읽기 Q를 표준 입력, 2 개 개의 나중에 사용하기 위해 변수 계산 : n = q - q%2hn = n/2
*시작 메인 루프, 반복 연구 에서, 행 번호를, Q , 루프의 시작 감소시키는, 0까지 처음 그래서 R 이다 q는
*계산은 다음 식으로 각 행 여왕 오프셋 :

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

*현재 행에 대한 퀸의 위치를 ​​들여 쓰기위한 출력 오프셋 공간 문자와 출력 루프가 더 쉬워 지므로 추가 공백이 하나 더 있습니다. 여왕
*Q를 출력하고 다음 줄로 이동하는 개행을 출력합니다 . r 이 0
*인지 테스트합니다 .이 경우 보드 끝에 도달하여 종료 할 수 있습니다. 그렇지 않으면 메인 루프를 다시 반복합니다.



0

레티 나 136 바이트

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

온라인으로 사용해보십시오! @orlp의 뛰어난 C 답변 포트. 설명:

.+
$* 

공백을 사용하여 단항으로 변환하십시오 (뒤에 공백이 있음 *).

$_;$`Q¶

만들기 N와 행 N에 공백하는 ;다음 0..N-1다음에 공백하는을 Q. 나머지 단계는 모든 행에 적용됩니다.

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

정수 N를 2로 나눕니다 (또한 :;패턴을 쉽게 고정 할 수 있도록 결과 를 줄 바꿈합니다 ).

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

루프 인덱스가 같으면 N/2*2많은 공백을 남겨 두십시오.

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

경우 N/23의 배수 인 다음 모듈로 더블 루프 인덱스 플러스 하나를 가지고 N/2*2+1.

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

그렇지 않으면, (N/2-1)보드의 아래쪽 절반에 모듈러스 3을 더한 루프 인덱스에 2를 더한 값을 더하십시오 N/2*2.

( +)%\1?

실제로 모듈로 작업을 수행하십시오.


0

, 44 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @orlp의 탁월한 C 답변의 또 다른 포트.


0

APL (Dyalog Unicode) , 18 바이트 SBCS

nstdin에서 전체 프로그램 프롬프트 . ·빈 사각형과 Queens를 사용하여 공백으로 구분 된 솔루션을 표준 출력으로 인쇄합니다 .

CY'dfns'
queens

온라인으로 사용해보십시오!

⎕CY'dfns'C의 영업 이익 Y 은 "dfns"도서관

 stdin으로부터 입력을 받다

queens 진정으로 독특한 퀸즈 솔루션 찾기 (반사 또는 회전 없음)

 첫 번째 해결책을 선택하십시오


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.