좀비 울타리 짓기

시간 제한1초메모리 제한128 MB

요약
크기가 6 이하인 n x n 격자에서, 숫자가 적힌 칸마다 네 변 중 정확히 그 수만큼 벽이 놓이도록 격자점을 잇는 가장 긴 단일 폐곡선 펜스를 찾는다.
난이도

보통10점 중 7점

유형
백트래킹, 완전 탐색, 그래프, 구현
정답자
아직 제출이 없습니다

문제

n×nn \times n 크기의 땅 격자가 주어집니다. 격자점(격자의 꼭짓점)을 잇는 선을 따라 울타리(벽)를 세워, 모든 벽이 교차나 분기 없이 하나의 닫힌 고리(단순 순환 하나)를 이루도록 만들어야 합니다. 즉, 모든 격자점에는 벽이 00개 또는 정확히 22개만 닿아야 합니다.

일부 칸에는 숫자(00, 11, 22, 33)가 적혀 있으며, 그러한 칸은 네 변에 정확히 그 숫자만큼의 벽으로 둘러싸여야 합니다. 숫자가 없는 칸은 아무런 제약도 주지 않습니다.

예를 들어, 다음과 같은 5×55 \times 5 격자가 주어지면:

다음과 같은 울타리를 만들 수 있습니다:

격자는 항상 n×nn \times n이며 1≤n≤61 \le n \le 6이고, 각 칸은 숫자(00, 11, 22, 33) 또는 빈칸입니다. 모든 숫자 제약을 만족하는 가장 긴 고리의 길이 — 즉 고리가 지나는 격자점의 개수 — 를 출력하거나, 유효한 고리가 없으면 −1-1을 출력합니다. 길이가 00인 고리는 유효하지 않으며, 유효한 고리는 00이 아닌 넓이를 둘러싸야 합니다.

입력

입력은 여러 개의 울타리 퍼즐로 이루어집니다. 각 퍼즐은 보드의 크기 nn (1≤n≤61 \le n \le 6)을 담은 줄로 시작하고, 이어서 각 줄에 nn개의 문자가 들어있는 nn개의 줄로 격자를 나타냅니다. 각 문자는 해당 칸의 벽 개수를 나타내는 숫자 0–3, 또는 제약이 없는 칸을 나타내는 -입니다. 각 퍼즐 뒤에는 빈 줄이 따릅니다. 입력의 끝은 00 하나만 있는 줄로 표시됩니다.

출력

각 퍼즐에 대해, 모든 제약을 지키면서 만들 수 있는 가장 긴 울타리 고리의 길이를 한 줄에 출력하고, 그러한 고리가 없으면 −1-1을 출력합니다. 답 사이를 구분하는 줄바꿈 외에는 불필요한 공백을 출력하지 않습니다.

예제2

  1. 예제 1

    입력
    2
    22
    22
    
    3
    222
    222
    222
    
    5
    ----0
    2---2
    3--2-
    2-2--
    22---
    
    6
    222222
    2-22-2
    22222-
    22-2-2
    2-22-2
    222222
    
    0
    
    예상 출력
    8
    -1
    32
    46
    
  2. 예제 2

    입력
    2
    --
    --
    
    0
    
    예상 출력
    8