골프장에 나무 심기!


10

이 도전은 이 앱에서 영감을 얻은 것입니다 .


이것은 이 도전 보다 훨씬 쉬운 버전입니다 . 이 과제는 이고 다른 과제는 .


당신은 크기의 사각형 입력 그리드이 제공됩니다 6별로 6 으로 나누어 져 6 개 각 영역의 세포가 난에서 소문자를 사용합니다 (고유 식별자가 영역 AF , 여기에 텍스트로를 그러나 원하는 것을 선택할 수 있습니다 (예 : 정수 1-6 ).

입력은 다음과 같습니다 (선택적 입력 형식).

aabbbb
aabbbb
aaccbb
acccdb
ecccdb
eeefff

또는 더 쉽게 시각화 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

도전:

다음 규칙에 따라이 공원에 6 그루의 나무 를 배치 해야합니다.

  • 정확히가 있어야한다 1 열당 나무, 그리고 1 개 행 당 트리
  • 모든 지역에는 정확히 1 개의 나무 가 있어야합니다 .
  • 수직, 수평 또는 대각선으로 다른 나무에 인접한 나무는 없습니다.

위의 레이아웃에 대한 해결책은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

참고 : 각 퍼즐에는 하나의 솔루션 만 있습니다.

추가 규칙 :

  • 입력 및 출력 형식은 선택 사항입니다
    • 예를 들어 출력은 인덱스 목록, 해당 위치에 트리가 있는지를 나타내는 1/0이 있는 그리드 또는 트리가 표시된 입력의 수정 된 버전 일 수 있습니다.
  • 실행 시간은 결정적이어야합니다.
  • 프로그램은 합리적인 현대 노트북에서 1 분 이내에 완료되어야합니다.
  • 당신이 무력하지 않으면 브라우니 포인트!

테스트 사례 :

aabbbb
aabbbb
aaccbb
acccdb
ecccdb
eeefff
---
aAbbbb
aabbbB
aaCcbb
acccDb
Ecccdb
eeeFff
----------
aabccc
aacccc
aaddce
aeeeee
aeeefe
eeeeee
---
aaBccc
aacccC
aadDce
Aeeeee
aeeeFe
eEeeee
----------
aaaabb
aacbbb
aadddb
addeef
ddddee
dddeee
---
aaaaBb
aaCbbb
Aadddb
addeeF
dDddee
dddEee
----------
abbbcd
abebcd
addddd
dddddd
effdff
eeffff
---
abBbcd
abebCd
Addddd
dddDdd
effdfF
eEffff

구문 분석하기가 더 쉬운 형식의 동일한 테스트 사례 :

Test case 1:
[1,1,2,2,2,2;1,1,2,2,2,2;1,1,3,3,2,2;1,3,3,3,4,2;5,3,3,3,4,2;5,5,5,6,6,6]
Test case 2:
[1,1,2,3,3,3;1,1,3,3,3,3;1,1,4,4,3,5;1,5,5,5,5,5;1,5,5,5,6,5;5,5,5,5,5,5]
Test case 3:
[1,1,1,1,2,2;1,1,3,2,2,2;1,1,4,4,4,2;1,4,4,5,5,6;4,4,4,4,5,5;4,4,4,5,5,5]
Test case 4:
[1,2,2,2,3,4;1,2,5,2,3,4;1,4,4,4,4,4;4,4,4,4,4,4;5,6,6,4,6,6;5,5,6,6,6,6]

스도쿠 솔버처럼 들리지만 다릅니다.
juniorRubyist

답변:


2

C, 223182 바이트

O[15],U;main(y,v)char**v;{if(y>7)for(;y-->2;printf("%06o\n",O[y]));else for(int*r,x=1,X=8;X<14;U&x|*r|O[10-y]*9&x*9?0:(U^=O[9-y]=*r=x,*r=main(y+1,v),U^=x),x*=8)r=O+v[1][y*7-++X]-88;}

질문에 제공된 형식으로 인수로 입력을받습니다. 나무가가는 1을 가진 0의 그리드로 출력을 stdout에 씁니다.

./TreesMin 'aabbbb
aabbbb
aaccbb
acccdb
ecccdb
eeefff'

샘플 출력 :

010000
000001
001000
000010
100000
000100

고장

O[15],                                  // Tree positions & region usage
U;                                      // Column usage (bitmask)
main(y,v)char**v;{                      // Recursive main function
  if(y>7)                               // Finished grid?
    for(;y-->2;printf("%06o\n",O[y]));  //  Print it (rows are padded octal)
  else                                  // Not finished:
    for(int*r,x=1,X=8;X<14;             //  Loop over columns
      U&x|*r|O[10-y]*9&x*9              //   Current cell violates rules?
        ?0                              //    Do nothing
        :(U^=O[9-y]=*r=x,               //   Else: mark cell
          *r=main(y+1,v),               //    Recurse
          U^=x)                         //    Unmark cell
      ,x*=8)                            //   Advance to next column
      r=O+v[1][y*7-++X]-88;             //   Region pointer for current iteration
}

이 질문의 가장 빠른 코드 버전에 대한 내 대답 의 적응입니다 . 단락이 많지 않지만 6x6 그리드에 대해 충분히 빠릅니다.


1

Clingo , 66 바이트

1{t(X,Y):c(X,Y,Z)}:-Z=1..n.:-t(X,Y),2{t(X,J;I,Y;X-1..X+1,Y..Y+1)}.

그리드 크기가 clingo plant.lp - -c n=<n>어디에서 실행하십시오 <n>. 입력 형식의 목록은 c(X,Y,Z).각각의 셀에 대한 구문 ( X, Y) 컬러 Z1 ≤와 X, Y, Zn, 선택적 공백으로 분리된다. t(X,Y)( X, Y) 에 각 트리에 대한 출력이 포함됩니다 .

데모

$ clingo plant.lp - -c n=6 <<EOF
> c(1,1,1). c(2,1,1). c(3,1,2). c(4,1,2). c(5,1,2). c(6,1,2).
> c(1,2,1). c(2,2,1). c(3,2,2). c(4,2,2). c(5,2,2). c(6,2,2).
> c(1,3,1). c(2,3,1). c(3,3,3). c(4,3,3). c(5,3,2). c(6,3,2).
> c(1,4,1). c(2,4,3). c(3,4,3). c(4,4,3). c(5,4,4). c(6,4,2).
> c(1,5,5). c(2,5,3). c(3,5,3). c(4,5,3). c(5,5,4). c(6,5,2).
> c(1,6,5). c(2,6,5). c(3,6,5). c(4,6,6). c(5,6,6). c(6,6,6).
> EOF
clingo version 5.1.0
Reading from plant.lp ...
Solving...
Answer: 1
c(1,1,1) c(2,1,1) c(3,1,2) c(4,1,2) c(5,1,2) c(6,1,2) c(1,2,1) c(2,2,1) c(3,2,2) c(4,2,2) c(5,2,2) c(6,2,2) c(1,3,1) c(2,3,1) c(3,3,3) c(4,3,3) c(5,3,2) c(6,3,2) c(1,4,1) c(2,4,3) c(3,4,3) c(4,4,3) c(5,4,4) c(6,4,2) c(1,5,5) c(2,5,3) c(3,5,3) c(4,5,3) c(5,5,4) c(6,5,2) c(1,6,5) c(2,6,5) c(3,6,5) c(4,6,6) c(5,6,6) c(6,6,6) t(1,5) t(2,1) t(6,2) t(3,3) t(5,4) t(4,6)
SATISFIABLE

Models       : 1+
Calls        : 1
Time         : 0.045s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

입 / 출력 형식을보다 쉽게 ​​처리 할 수 ​​있도록 도전 과제에 지정된 형식으로 변환하는 Python 프로그램이 있습니다.

입력

import sys
print(' '.join("c({},{},{}).".format(x + 1, y + 1, ord(cell) - ord('a') + 1) for y, row in enumerate(sys.stdin.read().splitlines()) for x, cell in enumerate(row)))

산출

import re
import sys
for line in sys.stdin:
    c = {(int(x), int(y)): int(z) for x, y, z in re.findall(r'\bc\((\d+),(\d+),(\d+)\)', line)}
    if c:
        t = {(int(x), int(y)) for x, y in re.findall(r'\bt\((\d+),(\d+)\)', line)}
        n, n = max(c)
        for y in range(1, n + 1):
            print(''.join(chr(ord('aA'[(x, y) in t]) + c[x, y] - 1) for x in range(1, n + 1)))
        print()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.