728x90
https://www.acmicpc.net/problem/1987
문제
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
코드
- BFS 적용
- (위치, 이동한 알파벳들)의 중복을 제거하여 시간초과 해결
import sys
from collections import deque
input = sys.stdin.readline
R, C = map(int, input().split())
matrix = []
for _ in range(R):
matrix.append(list(input()))
q = set([(0, 0, matrix[0][0])])
answer = 0
while q:
cur_row, cur_col, cur_path = q.pop()
answer = max(answer, len(cur_path))
for d_row, d_col in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
nxt_row, nxt_col = cur_row + d_row, cur_col + d_col
if 0 <= nxt_row < R and 0 <= nxt_col < C and matrix[nxt_row][nxt_col] not in cur_path:
q.add((nxt_row, nxt_col, cur_path + matrix[nxt_row][nxt_col]))
print(answer)
728x90
'Algorithm & Data Structure > Baekjoon' 카테고리의 다른 글
[Baekjoon/python] 벽 부수고 이동하기 #2206 (0) | 2023.06.19 |
---|---|
[Baekjoon/python] 트리 순회 #1991 (0) | 2023.06.15 |
[Baekjoon/python] 정수 삼각형 #1932 (0) | 2023.06.12 |
[Baekjoon/python] 후위표기식 #1918 (0) | 2023.06.10 |
[Baekjoon/python] 웜홀 #1865 (0) | 2023.06.09 |