π³ λ§ν¬
λ°±μ€ λ²½ λΆμκ³ μ΄λνκΈ°
π λ¬Έμ
NΓMμ νλ ¬λ‘ ννλλ λ§΅μ΄ μλ€. 맡μμ 0μ μ΄λν μ μλ κ³³μ λνλ΄κ³ , 1μ μ΄λν μ μλ λ²½μ΄ μλ κ³³μ λνλΈλ€. λΉμ μ (1, 1)μμ (N, M)μ μμΉκΉμ§ μ΄λνλ € νλλ°, μ΄λ μ΅λ¨ κ²½λ‘λ‘ μ΄λνλ € νλ€. μ΅λ¨κ²½λ‘λ 맡μμ κ°μ₯ μ μ κ°μμ μΉΈμ μ§λλ κ²½λ‘λ₯Ό λ§νλλ°, μ΄λ μμνλ μΉΈκ³Ό λλλ μΉΈλ ν¬ν¨ν΄μ μΌλ€.
λ§μ½μ μ΄λνλ λμ€μ ν κ°μ λ²½μ λΆμκ³ μ΄λνλ κ²μ΄ μ’ λ κ²½λ‘κ° μ§§μμ§λ€λ©΄, λ²½μ ν κ° κΉμ§ λΆμκ³ μ΄λνμ¬λ λλ€.
λ§΅μ΄ μ£Όμ΄μ‘μ λ, μ΅λ¨ κ²½λ‘λ₯Ό κ΅¬ν΄ λ΄λ νλ‘κ·Έλ¨μ μμ±νμμ€.
πΎ νμ΄ λ°©λ²
bfsλ¬Έμ μ λ²½μ λΆμλ μ‘°κ±΄μ΄ μΆκ°λ λ¬Έμ μ΄λ€.
λ°©λ¬Ένλ€λ κ²μ νμΈνκΈ° μν visit
λ°°μ΄μ λ¨μν [0]
μ΄ μλ [0,0]
κ³Ό κ°μ΄ λνλ΄μ΄ [0]
λ²μ§Έμλ 무쑰건 λ²½μ λΆμ κ²½μ°κ° λ€μ΄κ°λλ‘ μ€μ νλ€.
νΉν μ²μμ queue
μ κ°μ μ½μ
ν λ, νμ¬ μμΉλ₯Ό λνλ΄λ (x,y)
μ breakCount
μ¦ λ²½μ λΆμ μ μλ κ°μ§μμΈ 1
μ ν¨κ» λ£μ΄ (x,y,breakCount)
μ κ°μ΄ λ°λλ€. μ΄ν λ²½μ λΆμ κ²½μ°μλ breakCount = 0
μ΄ λλλ‘ νλ€..!
λ°λΌμ x,y,breakCount
λ₯Ό queue
μμ λΉΌλΈ λ€, Map
μ΄ λ²½μ΄κ³ breakCount
κ° 1
μΈ κ²½μ°μλ λ²½μ λΆμκ³ μ§λκ°λλ‘ νκ³ , visit
λ°°μ΄μ μ
λ°μ΄νΈ ν΄ μ€λ€.
μ€λ νΌ λ¬Έμ λͺ¨λ νμ΄λ₯Ό ν‘μ€μμ€νλ κΈ°λΆ...
κΆκΈν μ π§
νμ§λ§ λ§€μ° κΆκΈν μ μ΄ μλ€.
μλ λ μμ€μ½λλ₯Ό 보면 μκ² μ§λ§, bfs κ³Όμ μ ν¨μνν κ²κ³Ό κ·Έλ μ§ μμ κ² λκ°μ§μΈλ°, ν¨μνν κ²½μ°μλ python3μμ μκ°μ΄κ³Όκ° λμ§ μκ³ ν¨μννμ§ μμ κ²½μ°μλ python3μμ μκ°μ΄κ³Όκ° λλ€.
κ·Έλμ ν¨μννμ§ μμ κ²½μ°μ
Map
μ λ°μ λmap
ν¨μλ₯Ό ν΅ν΄int
λ‘ λ³νμν€λ μ½λλ‘ λ³κ²½νκΈ°Map == 1
κ³ΌMap == 0
λΆλΆμif-elif
ꡬ문μΌλ‘ λ³κ²½νκΈ°
λ±λ±μΌλ‘ λ³κ²½ν΄λ³΄μμ§λ§ μ¬μ ν μκ°μ΄κ³Όκ° λκ³ , μ½λλ μ무 λ³κ²½ μμ΄ ν¨μνμν€λ©΄ λ°λ‘ passκ° λμλ€.
λμ ν λͺ¨λ₯΄κ² μ΄μ time ν¨ν€μ§λ₯Ό νμ©νμ¬ time.perf_counter()λ‘ μκ° μΈ‘μ μ ν΄ λ³΄μλλ°, μλ μμ μ λν΄μλ μ¬μ§μ΄ ν¨μννμ§ μμ μ½λκ° λ λΉ¨λλ€..
6 4
0100
1110
1000
0000
0111
0000
ν¨μν μ½λ: 0.0009308000000000094
ν¨μννμ§ μμ μ½λ: 0.0007831999999999978
λλ체 λ¬΄μ¨ μ΄μ μΌκΉ?!?!?!?!?
μμ€μ½λ
python3μΌλ‘ νμ λ ν΅κ³Όν μ½λ
import sys
n, m = map(int, sys.stdin.readline().split())
Map = list()
for _ in range(n):
temp = sys.stdin.readline().strip()
temp = list(map(lambda x: int(x), temp))
Map.append(temp)
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
def bfs():
queue = [(0, 0, 1)]
visit = [[[0] * 2 for i in range(m)] for i in range(n)]
visit[0][0][1] = 1
while queue:
x, y, breakCount = queue.pop(0)
if x == n - 1 and y == m - 1:
return visit[x][y][breakCount]
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if Map[nx][ny] == 0 and visit[nx][ny][breakCount] == 0:
queue.append((nx, ny, breakCount))
visit[nx][ny][breakCount] = visit[x][y][breakCount] + 1
if Map[nx][ny] == 1 and breakCount == 1: # λ²½μ΄κ³ , λ²½μ λΆμμ§ μμ κ²½μ°
queue.append((nx, ny, 0))
visit[nx][ny][0] = visit[x][y][1] + 1
return -1
print(bfs())
python3μΌλ‘ νλ©΄ μκ°μ΄κ³Ό, Pypy3μΌλ‘ νλ©΄ ν΅κ³Ό
import sys
n, m = map(int, sys.stdin.readline().split())
Map = list()
for _ in range(n):
temp = sys.stdin.readline().strip()
temp = list(map(lambda x: int(x), temp))
Map.append(temp)
queue = [(0, 0, 1)]
visit = [[[0] * 2 for i in range(m)] for i in range(n)]
visit[0][0][1] = 1
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
count = -1
while queue:
x, y, breakCount = queue.pop(0)
if x == n - 1 and y == m - 1:
count = visit[x][y][breakCount]
break
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if Map[nx][ny] == 0 and visit[nx][ny][breakCount] == 0:
queue.append((nx, ny, breakCount))
visit[nx][ny][breakCount] = visit[x][y][breakCount] + 1
if Map[nx][ny] == 1 and breakCount == 1: # λ²½μ΄κ³ , λ²½μ λΆμμ§ μμ κ²½μ°
queue.append((nx, ny, 0))
visit[nx][ny][0] = visit[x][y][1] + 1
print(count)