점들을 연결할 수 있습니까?


18

이 과제는 Flow Free를 기반으로합니다. 온라인 버전은 http://www.moh97.us/에서 확인할 수 있습니다 .

퍼즐이 주어지며 1퍼즐을 풀 수 있거나 0그렇지 않은 경우 반환해야합니다 .

퍼즐을 풀기 위해 플레이어는 모든 빈 사각형을 정확히 한 번 사용하여 각 숫자 쌍을 연결하는 경로를 만들어야합니다.

정사각형의 치수로 전달 된 다음 각 점의 x, y, c (여기서 c는 색상을 나타내는 숫자)로 전달됩니다. 예를 들면 다음과 같습니다.

5,5 0,0,0 3,0,1 1,1,2 1,2,2 4,2,1 4,4,0전달 된 경우 다음을 나타냅니다.

0..1.
.2...
.2..1
....0

그리고 1을 반환해야합니다.


다음은 몇 가지 테스트 문제입니다.

5,2 2,0,1 0,1,2 4,1,2 나타냅니다 :

..1..
2...2

1 만 있기 때문에 해결할 수 없습니다 1.

4,2 0,0,0 3,0,0 0,1,0 3,1,0 나타냅니다 :

0..0
0..0

2 0초 이상을 포함하므로 해결할 수 없습니다 .

8,6 0,0,1 7,5,1 나타냅니다 :

1.......
........
........
........
........
.......1

모든 사각형을 사용할 수 없으므로 해결할 수 없습니다.

2,5 0,0,1 2,0,6 4,0,6 0,1,4 3,1,4 4,1,1 나타냅니다 :

1.6.6
4..41

1을 연결할 수 없기 때문에 해결할 수 없습니다.

6,3 1,0,4 5,0,1 0,1,4 1,1,3 5,1,3 0,2,2 3,2,2 5,2,1 나타냅니다 :

.4...1
43...3
2..2.1

두 경로가 반드시 교차해야하기 때문에 1 (또는 3)을 연결할 수 없기 때문에 해결할 수 없습니다.

5,2 0,0,1 3,0,1 0,1,3 4,1,1 나타냅니다 :

1..1.
3...3

경로를 만드는 데 모든 사각형을 사용할 수 없기 때문에 해결할 수 없습니다.

2,2 0,0,0 1,1,0 나타냅니다 :

1.
.1

여기에 모든 사각형을 사용할 수 없기 때문에 해결할 수 없습니다

몇 가지 테스트가 더 있습니다 :

5,5 0,3,0 0,4,1 1,2,2 1,3,1 2,0,0 3,0,4 3,1,2 3,3,5 3,4,4 4,4,5 1을 반환해야합니다

13,13 1,1,0 9,1,1 10,1,2 11,1,3 1,2,4 2,2,5 5,2,6 7,2,7 3,3,0 5,4,6 6,4,1 9,6,3 4,7,8 5,8,9 12,8,8 11,9,10 2,10,4 4,10,2 9,10,5 11,10,7 1,11,9 12,12,10 1을 반환해야합니다

7,7 0,0,0 0,1,1 1,1,2 2,1,3 4,2,4 0,3,1 5,3,3 0,4,4 2,4,5 5,4,2 0,5,0 1,5,5 3,5,6 3,7,6 0을 반환해야합니다


이것은 코드 골프이며 표준 규칙이 적용됩니다.


2
해결책이 "실제적으로"정확하거나 이론적으로 정확해야합니까? 예를 들어, 상태 공간은 6 개의 가능한 입력-입력 구성 중 하나를 각 빈 셀에 할당하는 것으로 나눌 수 있습니다. 모든 6 ^ N 조합을 시도하고 이들 1중 하나가 모든 셀을 방문하고 모든 터미널을 연결하면 리턴하여 쉽게 솔버 션을 판별합니다 . 분명히이 방법은 가장 작은 것 N(빈 셀 수)을 제외 하고는 적당한 시간 내에 완료되지는 않지만 알고리즘이 결국 올바른 값을 반환한다는 수학적 보장은 여전히 ​​있습니다.
COTO

1
아마도 공통 알고리즘을 사용하여 두 개의 거대한 재생 그리드 세트 (테스트를 위해 공개 하나, 유효성 검사를 위해 비공개)를 얻은 경우 승자가 일부 개인 세트에서 가장 많은 그리드의 해결 가능성을 올바르게 식별 한 제출물로 간주했을 것입니다 두 개의 제출물이 동일한 유틸리티를 갖는 경우 프로그램 크기가 순위 결정자 인 그리드 당 합리적인 시간. 나는 확실히 내 손을 시도합니다.
COTO

1
@NathanMerrill : 문제는 SAT환원 될 수 있고 따라서 NP가 어렵다.
COTO

3
@NathanMerrill은 문제를 SAT로 줄이면 문제가 NP-hard가 아니라 NP에 있음을 의미합니다. 문제의 NP-hardness를 나타내는 문제로 SAT를 줄입니다. 링크 한 페이지에는 NP- 완전성 증명 링크가 있습니다.
cardboard_box

1
@VisualMelon 숫자 색상이 잘못된 단어입니다. 각 색상은 숫자가 아닌 다른 숫자로 표시됩니다.
Nathan Merrill

답변:


3

하스켈

import Data.List.Split
import qualified Data.Sequence as Q
import Data.List
import Control.Monad

data A a = S a | E a | P a | X deriving Eq

sc = foldr1 (Q.><)
sp b x y p = Q.update y (Q.update x p $ b `Q.index` y) b
dt b c | S c `elem` sc b = E c
       | otherwise = S c
ad b [x, y, c] = sp b x y (dt b c)

ep b [x, y, c] = do
  let nps = filter ob [(x+1, y), (x-1, y), (x, y+1), (x, y-1)]
      ns = map gp nps
  [b | E c `elem` ns] ++ do
    (x', y') <- filter ((== X) . gp) nps
    ep (sp b x' y' (P c)) [x', y', c]
  where ob (u, v) = 0 <= u && u < length (b `Q.index` 0) && 0 <= v && v < length b
        gp (u, v) = b `Q.index` v `Q.index` u

rd i = let [c, r] : ps = (map read . splitOn ",") <$> words i :: [[Int]]
           e = Q.replicate r $ Q.replicate c X
           cs = map last ps
           ss = nubBy (\[_,_,c1] [_,_,c2] -> c1 == c2) ps
           b = foldl ad e ps
           bs = foldM ep b ss
       in if even (length cs) && length ss == length cs `div` 2 &&
             (all (\[j,k] -> j==k) . chunksOf 2 . sort $ cs) &&
             any (null . Q.elemIndicesL X . sc) bs
           then 1
           else 0

main = rd <$> getContents >>= print

  • sc : 시퀀스 연결
  • sp : 위치 설정
  • dt : 도트 유형 (즉, 줄의 시작 또는 끝)
  • 광고 : 점 추가
  • ep : 경로 확장
  • rd : 런 도트 (기본 순수 알고리즘)

2
제출해 주셔서 감사하며 PPCG 스택 교환에 오신 것을 환영합니다. 이것은 코드 골프 도전이며, 목적은 도전을 해결하는 가장 짧은 프로그램을 작성하는 것입니다. 당신이 유일한 답을 가지고 있기 때문에 당신은 선두에 있습니다. 그러나 당신은 가능한 한 프로그램을 줄이려고 노력해야합니다.
isaacg 1:25에

이 질문에 대해이 질문에 답변 한 것에 대해 솔직히 감동합니다. 또한이 문제는 코드 도전에 더 가깝지만 코드 골프를 사용했습니다. 다른 점수 기준을 찾기가 어려웠습니다.
Nathan Merrill

그렇습니다. 나는 "골프"측면에 대해 너무 걱정하지 않았습니다. 나는 Haskell을 배우려고 노력하는데 그것은 재미있는 문제처럼 보였다 :-)
Matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.