https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
bfs로 풀면 된다.
3차원 배열을 선언하고 토마토가 있는 자표들을 queue에 넣어주고 bfs를 적용하면 된다.
from collections import deque
N, M = map(int, input().split())
titub = [[] * M for i in range(N)]
for i in range(N):
a = input()
for j in a:
titub[i].append(j)
visited = [[0] * M for i in range(N)]
star = []
D_x = 0
D_y = 0
for i in range(N):
for j in range(M):
if titub[i][j] == '*':
star_x = i
star_y = j
star.append([star_x, star_y])
if titub[i][j] == 'S':
S_x = i
S_y = j
visited[i][j] = 1
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def bfs(star, Sx, Sy):
queue = deque()
for e in star:
visited[e[0]][e[1]] = '*'
queue.append([e[0], e[1]])
queue.append([Sx, Sy])
visited[Sx][Sy] = 1
while queue:
x, y = queue.popleft()
#print(x, y)
if visited[x][y] != '*':
count = visited[x][y] + 1
for j in range(4):
nx = x + dx[j]
ny = y + dy[j]
if 0 <= nx < N and 0 <= ny < M:
if titub[nx][ny] == 'D':
print(count - 1)
return
if titub[nx][ny] != 'X' and visited[nx][ny] == 0:
visited[nx][ny] = count
queue.append([nx, ny])
elif visited[x][y] == '*':
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < N and 0 <= ny < M:
if titub[nx][ny] != 'X' and titub[nx][ny] != 'D' and visited[nx][ny] != '*' and visited[nx][ny] == 0:
visited[nx][ny] = '*'
queue.append([nx, ny])
print("KAKTUS")
bfs(star, S_x, S_y)
'알고리즘 > python' 카테고리의 다른 글
| 1309번 동물원(python3) (0) | 2022.02.02 |
|---|---|
| 3055번 탈출(python3) (0) | 2022.02.02 |
| 7576번 토마토(python3) (0) | 2022.01.30 |
| 1012번 유기농 배추(python3) (0) | 2022.01.30 |
| 2606번 바이러스(python3) (0) | 2022.01.30 |