지뢰 찾기 마스터

시간 제한5초메모리 제한512 MB

요약
R행 C열 격자에 지뢰 M개를 배치해 모서리 한 번의 클릭으로 모든 안전 칸이 드러나게 하며, 불가능하면 Impossible을 출력합니다.
난이도

보통10점 중 7점

유형
구현, 행렬
정답자
아직 제출이 없습니다

문제

지뢰 찾기는 1980년대에 인기를 끈 컴퓨터 게임이고, 일부 Microsoft Windows 버전에는 지금도 들어 있다. 이 문제는 같은 규칙을 쓰지만, 게임을 해 본 적이 없어도 풀 수 있다.

R×CR \times C 격자에서 게임을 한다. 모든 칸은 처음에 덮여 있다. 서로 다른 MM개의 칸에 지뢰가 하나씩 숨어 있고, 나머지 칸에는 지뢰가 없다. 원하는 칸을 눌러서 열 수 있다. 지뢰가 있는 칸을 열면 게임이 끝나고 진다. 지뢰가 없는 칸을 열면 그 칸에 0 이상 8 이하의 숫자가 나오고, 이 숫자는 인접한 칸 가운데 지뢰가 있는 칸의 개수다. 두 칸은 변이나 꼭짓점을 공유하면 인접하다. 열린 칸의 숫자가 0이면 인접한 칸이 모두 자동으로 열리고, 새로 열린 칸의 숫자가 또 0이면 같은 일이 반복된다. 지뢰가 없는 칸이 모두 열리면 게임이 끝나고 이긴다.

예를 들어 판이 다음과 같이 놓였다고 하자. '*'는 지뢰, 'c'는 처음 누른 칸이다.

* . . * . . . * * .
. . . . * . . . . .
. . c . . * . . . .
. . . . . . . . * .
. . . . . . . . . .

누른 칸에 인접한 지뢰가 없으므로 그 칸은 0이 되고 인접한 여덟 칸이 함께 열린다. 열림이 계속 번지면 판은 다음과 같이 된다.

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

지뢰가 없으면서 아직 덮여 있는 칸('.')이 남아 있으므로, 게임을 이어 가려면 한 번 더 눌러야 한다.

한 번만 눌러서 이기는 것보다 빠른 승리는 없다. 판의 크기 R×CR \times C와 지뢰 개수 MM이 주어질 때, 누르는 칸을 마음대로 고를 수 있다면 한 번만 눌러서 이길 수 있는 배치가 있는지 판정하고, 있으면 그런 배치를 하나 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 다음 TT개의 줄에 각각 세 정수 RR, CC, MM이 공백으로 구분되어 주어진다.

제한

  • 1≤T≤1401 \le T \le 140
  • 1≤R,C≤501 \le R, C \le 50
  • 0≤M<R×C0 \le M < R \times C

출력

각 테스트 케이스마다 먼저 "Case #x:" 형식의 줄을 출력한다. xx는 1부터 시작하는 테스트 케이스 번호다.

한 번 눌러서 이길 수 있는 배치가 없으면 다음 줄에 Impossible을 출력한다.

배치가 있으면 RR개의 줄에 각각 CC개의 문자를 출력한다. 지뢰가 없는 칸은 '.', 지뢰가 있는 칸은 '*', 처음 누르는 칸은 'c'로 적는다. 이기는 배치가 여러 개일 수 있으므로, 다음 네 조건을 모두 만족하는 배치를 출력한다.

  1. 처음 누르는 칸은 첫째 줄 첫째 열의 칸이다.
  2. 각 줄에서 지뢰가 없는 칸은 첫째 열부터 빈틈없이 이어진다. 처음 누르는 칸도 지뢰가 없는 칸으로 센다.
  3. 지뢰가 없는 칸의 개수는 아래 줄로 갈수록 늘어나지 않는다.
  4. 앞의 세 조건을 만족하면서 이기는 배치 가운데, ii번째 줄의 지뢰 없는 칸 개수를 aia_i라 할 때 수열 (a1,a2,…,aR)(a_1, a_2, \dots, a_R)이 사전순으로 가장 큰 것을 출력한다.

한 번 눌러서 이길 수 있는 배치가 하나라도 있으면, 네 조건을 모두 만족하는 배치도 있다.

예제2

  1. 예제 1

    입력
    5
    5 5 23
    3 1 1
    2 2 1
    4 7 3
    10 10 82
    
    예상 출력
    Case #1:
    Impossible
    Case #2:
    c
    .
    *
    Case #3:
    Impossible
    Case #4:
    c......
    .......
    .......
    ....***
    Case #5:
    c........*
    .........*
    **********
    **********
    **********
    **********
    **********
    **********
    **********
    **********
    
  2. 예제 2

    입력
    6
    1 1 0
    1 6 0
    1 6 5
    6 1 4
    2 2 0
    2 2 2
    
    예상 출력
    Case #1:
    c
    Case #2:
    c.....
    Case #3:
    c*****
    Case #4:
    c
    .
    *
    *
    *
    *
    Case #5:
    c.
    ..
    Case #6:
    Impossible