ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฐฑ์ค: 2206 ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
dirmathfl 2020. 8. 3. 19:03๋ฌธ์
2206๋ฒ: ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
NรM์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๏ฟฝ๏ฟฝ
www.acmicpc.net
๋ฌธ์ ํ์ด
๊ทธ๋ํ๋ฅผ ํ์ํ๋๋ฐ ์ด๋ํ ์ ์์ ๊ฒฝ์ฐ ๋ฒฝ ํ๋๋ฅผ ๋ถ์๊ณ ํ์์ ์ด์ด๊ฐ ์ ์๋ค. ์ฆ, ๋ฒฝ ํ๋๋ฅผ ๋ถ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ต๋จ ๊ฒฝ๋ก๋ก (N, M)์ ๋์ฐฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ์ด๋ค. ๋ณดํต ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋, 2์ฐจ์ ๋ฐฐ์ด์ ์์ฑํ์ฌ ์ด๋ํ ๊ฑฐ๋ฆฌ๋ฅผ ์ค์ฒฉ์์ผ๋ฉฐ ์์ผ๋ก ๋์๊ฐ๋ฉฐ ๋ชฉ์ ์ง์ ๋์ฐฉํ ๊ฒฝ์ฐ ํ์์ ์ข ๋ฃํ๋ค. ๋ฌธ์ ์์๋ ๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ 2๊ฐ์ง์ ๊ฒฝ์ฐ์ ์๊ฐ ์กด์ฌํ๊ธฐ์ ๊ธฐ์กด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ค์ฒฉํ๋ ๋ฐฉ์์ด ์๋ 3์ฐจ์ ๋ฐฐ์ด์ ํตํด ๋ถ์ ๊ฒฝ์ฐ์ ๋ํ ๊ฒฝ์ฐ์ ์๋ ๋ฐ๋ก ์ค์ฒฉ์ํจ๋ค.
์ฝ๋
from sys import stdin
from collections import deque
def visitable(x, y, w):
return 0 <= x < n and 0 <= y < m and not visited[x][y][w]
def bfs(start):
q = deque([start])
dirs = ((-1, 0), (0, 1), (1, 0), (0, -1))
while q:
cur_x, cur_y, wall = q.popleft()
dist = visited[cur_x][cur_y][wall] + 1
if [cur_x, cur_y] == [n - 1, m - 1]:
return visited[cur_x][cur_y][wall]
for x, y in dirs:
next_x, next_y = cur_x + x, cur_y + y
if visitable(next_x, next_y, wall):
if not graph[next_x][next_y]:
visited[next_x][next_y][wall] = dist
q.append((next_x, next_y, wall))
elif not wall:
visited[next_x][next_y][not wall] = dist
q.append((next_x, next_y, not wall))
return -1
if __name__ == '__main__':
n, m = map(int, stdin.readline().split())
graph = [list(map(int, stdin.readline().strip())) for _ in range(n)]
visited = [[[0, 0] for _ in range(m)] for _ in range(n)]
visited[0][0] = [1, 1]
print(bfs((0, 0, 0)))
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 16933 ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 3 (0) | 2020.08.04 |
---|---|
๋ฐฑ์ค: 14442 ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 2 (0) | 2020.08.03 |
๋ฐฑ์ค: 14502 ์ฐ๊ตฌ์ (0) | 2020.08.03 |
๋ฐฑ์ค: 16948 ๋ฐ์ค ๋์ดํธ (0) | 2020.08.02 |
๋ฐฑ์ค: 9663 N-Queen (0) | 2020.08.01 |