티스토리 뷰
728x90
https://www.acmicpc.net/problem/1987
- 해설 :
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 문제이다.
- 풀이 :
BFS로 상하좌우에 대해 현재까지 탐색한 알파벳인지 확인한 후 탐색하여 더이상 진행할 수 없을 때 최댓값을 출력한다.
- 소스코드 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import sys
# 좌, 하, 우, 상
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
def BFS(x, y):
global answer
q = set([(x, y, board[x][y])])
while q:
x, y, ans = q.pop()
# 좌우상하 갈 수 있는지 살펴본다
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# index 벗어나지 않는지 체크하고, 새로운 칸이 중복되는 알파벳인지 체크한다
if ((0 <= nx < R) and (0 <= ny < C)) and (board[nx][ny] not in ans):
q.add((nx,ny,ans + board[nx][ny]))
answer = max(answer, len(ans)+1)
R, C = map(int, sys.stdin.readline().split())
board = [list(sys.stdin.readline().strip()) for _ in range(R)]
answer = 1
BFS(0, 0)
print(answer)
|
cs |
320x100
'Algorithm > DFS & BFS' 카테고리의 다른 글
(Python) - BOJ(2468번) : 안전 영역 (0) | 2022.01.31 |
---|---|
(Python) - BOJ(2178번) : 미로 탐색 (0) | 2022.01.30 |
(Python) - BOJ(1389번) : 케빈 베이컨의 6단계 법칙 (0) | 2022.01.26 |
(Python) - BOJ(1303번) : 전투 (0) | 2022.01.26 |
(Python) - BOJ(1260번) : DFS와 BFS (0) | 2022.01.26 |
댓글
© 2022 WonSeok, All rights reserved