불 밝히기

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

요약
크기가 7×7 이하이고 숫자가 적힌 장애물이 있는 판에서 모든 빈 칸을 밝히면서 두 램프가 서로를 비추지 않고 숫자 장애물마다 인접 램프 수가 정확히 맞도록 하는 최소 램프 개수를 구하거나 해가 없음을 판정한다.
난이도

어려움10점 중 8점

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

문제

불 밝히기(Light Up)는 여러 개의 작은 정사각형 칸으로 나뉜 직사각형 판 위에서 진행하는 퍼즐이다. 판의 일부 칸은 "빈 칸"(아래 그림의 흰색 칸)이고, 일부 칸은 "벽 칸"(아래 그림의 검은색 칸)이다. 벽 칸에는 정수 ii (0≤i≤40 \le i \le 4)가 적혀 있을 수도 있다.

그림 2: (a) 6행 7열, 벽 7개로 이루어진 퍼즐; (b) 그 퍼즐의 한 가지 해.

이 퍼즐의 목표는 일부 빈 칸에 전구(그림에서 원으로 표시)를 놓아 모든 빈 칸을 "밝히는" 것이다. 각 전구는 자신이 놓인 칸을 밝히고, 거기에서 가로 또는 세로로 일직선을 따라 벽 칸이나 판의 끝에 닿을 때까지의 모든 칸을 함께 밝힌다.

올바른(승리) 배치는 다음 조건을 모두 만족한다.

  • 모든 빈 칸이 밝혀져야 한다.
  • 어떤 전구도 다른 전구에 의해 밝혀져서는 안 된다.
  • 숫자가 적힌 모든 벽 칸은, 그 칸과 상하좌우로 인접한 네 칸 중 정확히 그 숫자만큼의 칸에 전구가 놓여 있어야 한다.
  • 숫자가 없는 벽 칸에는 인접한 전구의 개수에 제한이 없다.

올바른 배치를 이루는 데 필요한 전구의 최소 개수를 구하는 프로그램을 작성하여라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 판의 행 수와 열 수를 나타내는 두 정수 NN, MM이 주어진다 (1≤N≤71 \le N \le 7, 1≤M≤71 \le M \le 7). 둘째 줄에는 벽 칸의 개수를 나타내는 정수 BB가 주어진다 (0≤B≤N×M0 \le B \le N \times M). 이어지는 BB개의 줄에는 각 벽 칸을 나타내는 세 정수 RR, CC, KK가 주어지며, 각각 행 번호(1≤R≤N1 \le R \le N), 열 번호(1≤C≤M1 \le C \le M), 벽의 숫자(−1≤K≤4-1 \le K \le 4)를 뜻한다. K=−1K = -1은 숫자가 없는 벽임을 뜻한다. 입력의 끝은 N=M=0N = M = 0인 줄로 표시된다.

출력

각 테스트 케이스마다 한 줄을 출력한다. 올바른 배치가 존재하면 그 배치를 이루는 데 필요한 전구의 최소 개수를, 존재하지 않으면 No solution을 출력한다.

예제1

  1. 예제 1

    입력
    2 2
    0
    2 2
    1
    2 2 1
    6 7
    7
    2 3 -1
    3 3 0
    4 2 1
    5 4 3
    5 6 2
    1 7 -1
    6 5 -1
    0 0
    
    예상 출력
    2
    No solution
    8