스택 미로
시간 제한8초메모리 제한256 MB
격자에서 오른쪽이나 아래로만 이동하며 문자로 표시된 보석을 주워 스택 순서에 따라 같은 문자의 구멍에 넣어 매칭 수를 최대화합니다.
문제
미로는 가로 칸, 세로 칸인 격자다. 왼쪽 위 칸을 , 오른쪽 아래 칸을 로 나타낸다. 지금 에 있고 까지 가야 하는데, 이동은 오른쪽으로 한 칸 또는 아래로 한 칸만 할 수 있다.
다음은 미로의 한 예다.
...#......
a###.#####
.bc...A...
##.#C#d#.#
.#B#.#.###
.#...#e.D.
.#A..###.#
..e.c#..E.
####d###.#
#....#.#.#
##E...d.C.
미로의 어떤 칸은 비어 있고(.), 어떤 칸은 바위가 막고 있다(#). 바위 칸에는 들어갈 수 없다. 빈 칸 중 일부에는 보석이 놓여 있고(소문자), 일부에는 보석을 끼우는 구멍이 있다(대문자). 알파벳이 다르면 보석의 종류도 다르다. 즉 a 칸에는 A 종류의 보석이 있고, A 칸에는 A 종류의 보석을 끼우는 구멍이 있다. 보석을 맞는 구멍에 끼우면 좋은 일이 생긴다고 한다.
보석이 있는 칸에서는 그 보석을 집을지 말지 고를 수 있다. 구멍이 있는 칸에서는 가진 보석을 끼울지 말지 고를 수 있다. 처음에는 보석이 하나도 없다. 가방은 아주 커서 보석을 몇 개든 넣을 수 있다. 대신 가방은 스택이라, 가장 마지막에 집은 보석만 꺼내서 끼울 수 있다.
에서 까지 가는 동안 맞는 구멍에 끼울 수 있는 보석은 최대 몇 개인가?
입력
입력은 여러 개의 데이터 집합으로 이루어진다. 0이 두 개 적힌 줄이 나오면 입력이 끝나고, 그 줄은 데이터 집합이 아니다.
각 데이터 집합의 형식은 다음과 같다.
H W
C11C12...C1W
C21C22...C2W
...
CH1CH2...CHW
와 는 격자의 세로와 가로 크기이고, 이다. 이어지는 개의 줄에는 각각 개의 문자가 빈칸 없이 붙어서 온다. 번째 줄의 번째 문자 는 행 열 칸의 종류를 위에서 설명한 대로 나타낸다. 출발 칸인 1행 1열과 도착 칸인 행 열은 절대 #이 아니다.
한 데이터 집합에서 각 소문자와 각 대문자는 많아야 10번 나온다.
출력
각 데이터 집합마다 맞는 구멍에 끼울 수 있는 보석의 최대 개수를 한 줄에 하나씩 출력한다. 칸에 도달할 수 없으면 -1을 출력한다.