https://www.acmicpc.net/problem/14503
14503๋ฒ: ๋ก๋ด ์ฒญ์๊ธฐ
์ฒซ์งธ ์ค์ ๋ฐฉ์ ํฌ๊ธฐ $N$๊ณผ $M$์ด ์ ๋ ฅ๋๋ค. $(3 \le N, M \le 50)$โ ๋์งธ ์ค์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ขํ $(r, c)$์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ $d$๊ฐ ์ ๋ ฅ๋๋ค. $d$๊ฐ $0$์ธ ๊ฒฝ์ฐ ๋ถ์ชฝ
www.acmicpc.net
์ ๋ต๋ฅ ์ด ๋์์ ๊ธ๋ฐฉ ํ ์ค ์์๋๋ฐ, ์๊ฐ๋ณด๋ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์๋ ๋ฌธ์ .
๋ฌธ์ ์ ์ ํํ ๊ท์น์ ์ดํดํ๋ ๊ฒ ์ฝ์ง ์์๋ค.
๊ทธ๋๋ ์ดํดํ๊ณ ๋์๋ ์ด๋ป๊ฒ ์ด๋ป๊ฒ ํ๋ผ๋๋๋ก ๊ทธ๋๋ก ๊ตฌํํ๋ ์ ๋ต ํ์ ์ ๋ฐ๊ธด ํ๋น
๋ด๊ฐ ํผ ๋ฐฉ๋ฒ์ ์ด๋ ๋ค.
0. ์ฒญ์ํ๋ ์นธ์ ๊ฐ์๋ฅผ count๋ผ๊ณ ํ๊ณ , ์ฒญ์์๋ฃ๋ ์นธ์ 2๋ก ํ์ํ๊ธฐ๋ก ํ๋ค.
1. ์์์ขํ๋ฅผ ํ์ ๋ด๊ณ bfs๋ฅผ ์์ํ๋ค.
2. ํ์ฌ ์นธ์ด 0์ด๋ผ๋ฉด, ํ์ฌ ์นธ ๊ฐ์ 2๋ก ๋ฐ๊พธ์ด์ฃผ๊ณ count๋ฅผ ์ฆ๊ฐ์์ผ์ค๋ค.
3. ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ๋๋ฉด์, ๋ฐ๋ก ์ ์นธ์ด 0์ด๋ผ๋ฉด ์ ์งํ๋ค.
4. ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 4๋ฒ ๋์๋๋ฐ๋ 0์ธ ์นธ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ฉด, ๋ค๋ก ํ ์นธ ํ์งํ๋ค.
5. 2~4 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
6. ๋ฒฝ์ ๋งํ ํ์ง์ด ๋ถ๊ฐ๋ฅํด์ง๋ฉด ์ฒญ์(ํ์)๋ฅผ ๋๋ธ๋ค.
์ฝ๋์ ๋ํ ์ฝ๊ฐ์ ์ค๋ช
1. ํ์ฌ ๋ฐฉํฅ ์ ๋ณด ํ์ํ๊ธฐ
์ฒ์์๋ ํ์ ์ขํ์ ๋ณด๋ฅผ ๋ฃ์๋ ๋ฐฉํฅ์ ๋ณด๊น์ง ๊ฐ์ด ๋ฃ์ผ๋ ค๊ณ ํ๋๋ฐ,
์คํ๋ ค ๋ฒ๊ฑฐ๋กญ๊ณ ํท๊ฐ๋ ค์ง ๊ฒ ๊ฐ์์
์ฐจ๋ผ๋ฆฌ ํ์ฌ ๋ฐฉํฅ์ ๋ํ๋ด๋ ๋ณ์ d๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ , ์ ๋ฐ์ดํธ์์ผ๊ฐ๋ฉฐ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
d = 0,1,2,3 ์ค ํ๋
2. ๋ฐ์๊ณ๋ฐฉํฅ ํ์
ํ์ฌ ๋ฐฉํฅ d = 0,1,2,3์ผ ๋ --> ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ฉด ๋ฐฉํฅ์ ๊ฐ๊ฐ 3,0,1,2๊ฐ ๋๋ค.
rotate=[3,0,1,2]๋ก ์ ์ธํด๋๋ฉด, ํ์ฌ๋ฐฉํฅ d๊ฐ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ ๊ฒฐ๊ณผ๋ rotate[d]๊ฐ ๋๋ค.
3. ํ์ง
ํ์งํ ๋์๋ ๋ฐฉํฅ d๋ ๊ฐฑ์ ํ์ง ๋ง๊ณ ๊ทธ๋๋ก ๋ฌ์ผํ๋ค.
์์น๋ง ํ ์นธ ๋ค๋ก ์ฎ๊ฒจ๊ฐ์ผํ๋ค.
ํ์ฌ ๋ฐฉํฅ์ด 0์ผ ๋๋ ์๋๋ก ํ ์นธ ๊ฐ์ผ ํ๋ค. (x, y) --> (x+1, y)
ํ์ฌ ๋ฐฉํฅ์ด 1์ผ ๋๋ ์ผ์ชฝ์ผ๋ก ํ ์นธ ๊ฐ์ผ ํ๋ค. (x, y) --> (x, y-1)
ํ์ฌ ๋ฐฉํฅ์ด 2์ผ ๋๋ ์๋ก ํ ์นธ ๊ฐ์ผ ํ๋ค. (x, y) --> (x-1, y)
ํ์ฌ ๋ฐฉํฅ์ด 3์ผ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ๊ฐ์ผ ํ๋ค. (x, y) --> (x, y+1)
๋ฐ๋ผ์ ์๋์ ๊ฐ์ ๋ฐฐ์ด ๋๊ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ฉด,
backX, backY = [1,0,-1,0], [0,-1,0,1]
ํ์ฌ ์ขํ x, y์์ ๋ฐฉํฅ์ด d์ผ๋ ํ์งํ๋ ์นธ์ ์ขํ๋ ์๋์ ๊ฐ์ด ๋ํ๋ผ ์ ์๊ฒ ๋๋ค.
nextX, nextY = x + backX[d] , y + backY[d]
์ ๋ต ์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
#๋ฐ์๊ณํ์
rotate=[3,0,1,2]
#ํ์ง
backX=[1,0,-1,0]
backY=[0,-1,0,1]
#๋ถ,๋,๋จ,์์ชฝ ๋ฐฉํฅ ์ด๋
dx=[-1,0,1,0]
dy=[0,1,0,-1]
n,m = map(int,input().split())
r,c, d = map(int,input().split())
room=[]
for i in range(n):
room.append(list(map(int,input().split())))
cnt = 0
q=deque()
q.append((r,c))
while q:
x, y = q.popleft()
#์ฒญ์๋์ง ์์์ผ๋ฉด ์ฒญ์ํ๋ค.
if room[x][y]==0:
cnt += 1
room[x][y]=2
#๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 4๋ฒ ๋๋ฉด์ ์ต์ด๋ก ์ฒญ์๋์ง ์์ ์นธ์ ์ฐพ์ผ๋ฉด ์ ์งํ๋ค.
for i in range(4):
d=rotate[d] #ํ์ฌ๋ฐฉํฅ update์์ผ์ฃผ๊ธฐ
nx,ny = x+dx[d], y+dy[d]
if 0<=nx<n and 0<=ny<m:
if room[nx][ny]==0:
room[nx][ny]=2
cnt += 1
q.append((nx,ny))
break
#์ฃผ๋ณ ๋ค ์นธ ์ค์ ์ฒญ์๋์ง ์์ ์นธ์ด ์๋ ๊ฒฝ์ฐ, ํ์งํ๋ค.
if len(q)==0:
nx, ny = x+backX[d], y + backY[d]
if 0<=nx<n and 0<=ny<m:
#ํ์งํ๋๋ฐ ์ฒญ์ ์ ๋ ์นธ์ด๋ฉด ์ฒญ์ํ๋ค.
if room[nx][ny]==0:
room[nx][ny]=2
cnt +=1
q.append((nx,ny))
#ํ์งํ๋๋ฐ ์ฒญ์ ๋ ์นธ์ด๋ฉด ๊ทธ๋ฅ ํ์งํ๋ค.
elif room[nx][ny]==2:
q.append((nx,ny))
#ํ์งํ๋๋ฐ ๋ฒฝ์ด๋ฉด ์ฒญ์๋ฅผ ๋ฉ์ถ๋ค.
elif room[nx][ny]==1:
break
#์ฒญ์ํ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
print(cnt)
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด > DFS,BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค]7562๋ฒ: ๋์ดํธ์ ์ด๋ (0) | 2023.03.20 |
---|---|
[๋ฐฑ์ค]14502๋ฒ: ์ฐ๊ตฌ์ (1) | 2023.03.11 |
[๋ฐฑ์ค]18405๋ฒ: ๊ฒฝ์์ ์ ์ผ (0) | 2023.03.03 |
[๋ฐฑ์ค]7569๋ฒ: ํ ๋งํ (0) | 2023.02.28 |
[๋ฐฑ์ค]9205๋ฒ: ๋งฅ์ฃผ ๋ง์๋ฉด์ ๊ฑธ์ด๊ฐ๊ธฐ (0) | 2023.02.27 |