아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

누리카베

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

요약
9x9 이하 격자에서 여섯 가지 연결 및 개수 규칙을 만족하도록 각 칸을 검은색이나 흰색으로 칠해 Nurikabe 퍼즐을 푼다.
난이도

어려움10점 중 8점

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

문제

누리카베 퍼즐을 푸는 프로그램을 작성하자.

누리카베는 직사각형 격자 위에서 진행된다. 각 칸은 비어 있거나(. 로 표시) 한 자리 숫자가 적혀 있다. 퍼즐을 풀려면 모든 칸을 흰색(땅) 또는 검은색(바다) 중 하나로 칠해야 하며, 아래 조건을 모두 만족해야 한다. 여기서 섬이란 상하좌우로 이어진 흰색 칸들의 극대 연결 영역을 말한다.

  1. 모든 검은색 칸은 하나로 연결되어 있어야 한다.
  2. 숫자가 적힌 칸은 반드시 어떤 섬에 속해야 한다.
  3. 각 섬에 포함된 흰색 칸의 개수는 그 섬에 들어 있는 숫자와 같아야 한다.
  4. 모든 섬에는 숫자가 적힌 칸이 정확히 하나 있어야 한다.
  5. 서로 다른 두 섬은 인접(연결)해서는 안 된다.
  6. 2×22 \times 2 크기의 검은색 칸 덩어리는 존재할 수 없다.

칸의 인접은 상하좌우로만 판단하며, 대각선은 인접으로 보지 않는다. 입력으로는 항상 정답이 유일한 경우만 주어진다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다.

각 테스트 케이스의 첫 줄에는 퍼즐의 크기 nn과 mm이 공백으로 구분되어 주어진다. (3≤n,m≤93 \le n, m \le 9)

이어지는 nn개의 줄에는 퍼즐의 초기 상태가 주어진다. 각 줄은 mm개의 문자로 이루어지며, 빈 칸은 .으로, 숫자 칸은 그 칸에 적힌 숫자로 표시된다. 숫자는 항상 한 자리이다.

입력의 마지막 줄에는 0이 두 개 주어지며, 이는 입력의 끝을 의미한다.

출력

각 테스트 케이스마다 퍼즐을 푼 결과를 출력한다. 검은색 칸은 #으로 표시하고, 흰색 칸은 원래 문자(. 또는 숫자)를 그대로 출력한다. 서로 다른 퍼즐의 출력 사이에는 빈 줄을 하나씩 넣는다.

예제2

  1. 예제 1

    입력
    3 4
    3...
    ....
    .4..
    5 5
    2.5..
    .....
    .....
    .....
    ..4.3
    0 0
    
    예상 출력
    3..#
    ####
    .4..
    
    2#5..
    .#.##
    ##.#.
    .###.
    ..4#3
    
  2. 예제 2

    입력
    3 3
    1.1
    ...
    1.1
    0 0
    
    예상 출력
    1#1
    ###
    1#1