๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/DFS,BFS

[๋ฐฑ์ค€]14503๋ฒˆ: ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

by syLim___ 2023. 3. 8.
728x90

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)
728x90