Skip to content

Commit d233072

Browse files
authored
Merge branch 'AlgorithmStudy-Allumbus:main' into main
2 parents 3d35024 + 19e363b commit d233072

File tree

3 files changed

+134
-1
lines changed

3 files changed

+134
-1
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from collections import deque
2+
import sys
3+
"""
4+
1. μ΄ˆκΈ°ν™”
5+
- R,B 의 μœ„μΉ˜ μ’Œν‘œ
6+
- λ°©λ¬Έ 등둝
7+
2. queue
8+
3. 4λ°©μœ„
9+
-> νŒŒλž€ ꡬ술 ꡬ멍 -> μ‹€νŒ¨
10+
-> λΉ¨κ°„ ꡬ술 ꡬ멍 -> 성곡
11+
-> λ‘˜μ΄ 같은 μœ„μΉ˜=>
12+
"""
13+
14+
n, m = map(int, sys.stdin.readline().split())
15+
board = [list(input().rstrip()) for _ in range(n)]
16+
visited = []
17+
18+
# 우,쒌,ν•˜,상
19+
dx = [1 ,-1 , 0 ,0]
20+
dy = [0,0,-1,1]
21+
22+
def get_RB_position(): # Red , Blue
23+
rx ,ry, bx , by = 0 , 0, 0, 0
24+
for i in range(n):
25+
for j in range(m):
26+
if board[i][j] == "R" :
27+
rx , ry = i, j
28+
elif board[i][j] == "B":
29+
bx , by = i , j
30+
31+
return rx ,ry, bx , by
32+
33+
def move(x,y, dx , dy) :
34+
# λ²½ λ˜λŠ” κ΅¬λ©κΉŒμ§€ 이동
35+
# dx ,dy : λ°©ν–₯
36+
shift_cnt = 0
37+
while board[x + dx][y+dy] != "#" and board[x][y] != "O":
38+
x += dx
39+
y+= dy
40+
shift_cnt +=1
41+
42+
return x ,y, shift_cnt
43+
44+
45+
def bfs() :
46+
#1. μ΄ˆκΈ°ν™”
47+
rx , ry , bx , by = get_RB_position()
48+
queue = deque()
49+
queue.append((rx,ry, bx , by, 1)) # red μ’Œν‘œ , blue μ’Œν‘œ , 횟수
50+
visited.append((rx,ry , bx,by))
51+
52+
while queue :
53+
rx,ry,bx,by,result= queue.popleft()
54+
# 10회 μ΄ˆκ³Όν•΄λ„ μ•ˆλ‚˜μ˜€λ©΄ -1 λ°˜ν™˜
55+
if result > 10 :
56+
57+
break
58+
59+
for i in range(4): #
60+
crx , cry , r_shift = move(rx ,ry , dx[i], dy[i])
61+
cbx , cby , b_shift = move(bx ,by, dx[i], dy[i])
62+
63+
# λ§Œμ•½ νŒŒλž€κ³΅μ΄ ꡬ멍에 λ“€μ–΄κ°€λ©΄ μ‹€νŒ¨
64+
if board[cbx][cby] == "O" :
65+
continue
66+
# λ§Œμ•½ λΉ¨κ°„ 곡이 ꡬ멍에 λ“€μ–΄κ°€λ©΄ 성곡
67+
if board[crx][cry] == "O" :
68+
print(result)
69+
return 0
70+
# λ§Œμ•½ 두 곡이 겹치면 -> 더 많이 μ΄λ™ν•œ 곡이 더 전에 있음
71+
if cbx == crx and cry == cby :
72+
if r_shift > b_shift : # red κ°€ 더 멀리 있음
73+
crx -=dx[i]
74+
cry -= dy[i]
75+
else :
76+
cbx -=dx[i]
77+
cby -= dy[i]
78+
# 처음 λ„μ°©ν•œ 칸인 경우
79+
if (crx , cry , cbx, cby) not in visited :
80+
visited.append((crx , cry , cbx, cby))
81+
queue.append((crx , cry , cbx, cby , result +1))
82+
print(-1)
83+
84+
bfs()
85+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import sys
2+
from collections import deque
3+
# 1. μž…λ ₯ κ·Έλž˜ν”„
4+
N , M = map(int,sys.stdin.readline().split())
5+
graph = []
6+
for n in range(N) :
7+
graph.append(list(map(int, input())))
8+
9+
#λ°©λ¬Έ μ—¬λΆ€ & μ‹œμž‘λ…Έλ“œλ‘œ λΆ€ν„° μ΅œλ‹¨ 경둜 거리 ,λ²½ λΆ€μˆœ 횟수(3차원)
10+
visited = [[[0]*2 for _ in range(M)] for k in range(N)]
11+
12+
#μƒν•˜μ’Œμš° -> 인접 λ…Έλ“œ
13+
dx = [0,0,1,-1]
14+
dy = [1,-1,0,0]
15+
16+
# 2. bfs μ΅œλ‹¨ 거리
17+
def bfs():
18+
#초기 λ…Έλ“œ queue 에 μΆ”κ°€ , λ°©λ¬Έ 등둝
19+
dq = deque()
20+
dq.append((0,0,0))
21+
visited[0][0][0] = 1
22+
23+
while dq :
24+
x,y,wall = dq.popleft()
25+
# λͺ©μ μ§€(N,M) λ„μ°©ν•œ 경우,이동 횟수 좜λ ₯
26+
if x == N-1 and y == M -1 :
27+
return visited[x][y][wall]
28+
29+
for i in range(4):#μƒν•˜μ’Œμš°λ‘œ λ‹€μŒ 이동할 칸의 μœ„μΉ˜
30+
xx = x+ dx[i] ; yy = y+ dy[i]
31+
# (1)λ‹€μŒ 이동할 곳이 graph 밖에 μžˆλŠ” 경우
32+
if xx<0 or xx>= N or yy <0 or yy>= M:
33+
continue
34+
# (2) λ‹€μŒ 이동할 곳이 벽이고, ν•œλ²ˆλ„ λ²½ μ•ˆ λš€μ—ˆμ„λ•Œ
35+
if graph[xx][yy] == 1 and wall == 0 : # and not visited[xx][yy][1]
36+
visited[xx][yy][1] = visited[x][y][0]+1
37+
dq.append((xx,yy,1))
38+
39+
#(3)λ‹€μŒ 이동할 곳이 벽이 μ•„λ‹ˆκ³ ,ν•œλ²ˆλ„ λ°©λ¬Έ ν•˜μ§€ μ•Šμ€ κ³³
40+
elif graph[xx][yy] == 0 and visited[xx][yy][wall] == 0 : # κ·Έλƒ₯ 감
41+
visited[xx][yy][wall] = visited[x][y][wall] +1
42+
dq.append((xx,yy,wall))
43+
44+
return -1 #BFS μ’…λ£Œλ λ–„ κΉŒμ§€ 도착점에 λ„λ‹¬ν•˜μ§€ λͺ»ν•˜λ©΄ -1 좜λ ₯ν•˜κΈ°
45+
46+
print(bfs())
47+
48+

β€Ž_WeeklyChallenges/W04-[BFS]/README.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## πŸš€ 12μ›” 3μ£Όμ°¨ (12/21) μŠ€ν„°λ”” 발제 주제: BFS
1+
## πŸš€ 12μ›” 3μ£Όμ°¨ (12/16) μŠ€ν„°λ”” 발제 주제: BFS
22
> 발제자: 김홍주
33
44
### πŸ—‚οΈ μŠ€ν„°λ”” 자료

0 commit comments

Comments
Β (0)