๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2194 ์œ ๋‹› ์ด๋™์‹œํ‚ค๊ธฐ (ํŒŒ์ด์ฌ/python) bfs

by chjcoder 2023. 8. 14.

๐ŸŽˆ๋ฌธ์ œ

https://www.acmicpc.net/problem/2194

 

๐ŸŽ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜?

1. ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ผ๋Š” ๋ง์„ ๋ณด์ž๋งˆ์ž bfs๊ฐ€ ๋– ์˜ฌ๋ผ์•ผ ํ•œ๋‹ค!

 

๐Ÿ’ป ์ฝ”๋“œ

# 2194 ์œ ๋‹› ์ด๋™์‹œํ‚ค๊ธฐ
'''
์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜ -> bfs ๊ณ ๋ ค

1. ์œ ๋‹›์„ graph์—์„œ ์–ด๋–ค์‹์œผ๋กœ ํ‘œํ˜„ํ• ์ง€?
2. ์žฅ์• ๋ฌผ๊ณผ์˜ ์ถฉ๋Œ์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ• ์ง€?
3. ์œ ๋‹›์˜ ์ด๋™์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€?
4. ์œ ๋‹›์˜ ๋„์ฐฉ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€?

unit
unit์˜ ํฌ๊ธฐ์— ๋งž๊ฒŒ for๋ฌธ ๋Œ๋ฉด์„œ
์žฅ์• ๋ฌผ๊ณผ ๋ถ€๋”ชํžˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋ฉด ๋  ๋“ฏ?

'''

from collections import deque

# ์œ ๋‹›์ด ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„
def Unit_check(x,y):
    '''
    unit์ด graph๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋ฉด False
    unit์ด ์žฅ์• ๋ฌผ์„ ๋งŒ๋‚˜๋ฉด False
    ๊ทธ ์™ธ : True
    '''
    for i in range(x,x+a):
        for j in range(y,y+b):
            if i < 0 or i > (n-1) or j < 0 or j > (m-1):    # graph ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋ฉด
                return False
            if graph[i][j] == -1:   # ์žฅ์• ๋ฌผ์„ ๋งŒ๋‚˜๋ฉด
                return False

    return True # ๊ทธ ์™ธ True return

# 2. bfs ํƒ์ƒ‰ ํ•จ์ˆ˜ ๊ตฌํ˜„
def Bfs():
    deq = deque()
    deq.append(start)   # ์‹œ์ž‘์  ๋„ฃ๊ธฐ
    dx = [0,0,-1,1] # ์ƒํ•˜์ขŒ์šฐ ์„ค์ •
    dy = [1,-1,0,0]

    while deq:
        x,y = deq.popleft()
        if [x,y] == end:    # ๋„์ฐฉ์ ์— ๋„์ฐฉํ•˜๋ฉด ์ตœ์†Œ ํšŒ์ˆ˜ ์ถœ๋ ฅ
            print(graph[x][y])
            return
        for i in range(4):	# ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx > (n-1) or ny < 0 or ny > (m-1):
                continue
            if graph[nx][ny] != 0:	# ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
                continue
            if Unit_check(nx,ny):
                graph[nx][ny] = graph[x][y] + 1
                deq.append([nx,ny])


    print(-1)
    return


# 1. ์ž…๋ ฅ ๋ฐ›๊ธฐ
# n: graph์„ธ๋กœ(ํ–‰,x), m: graph๊ฐ€๋กœ(์—ด,y), a: unit์„ธ๋กœ(ํ–‰), b: unit๊ฐ€๋กœ(์—ด), k: ์žฅ์• ๋ฌผ ๊ฐœ์ˆ˜
n, m, a, b, k = map(int,input().split())

# graph ๋งŒ๋“ค๊ธฐ
graph = [[0 for j in range(m)] for i in range(n)]

# ์žฅ์• ๋ฌผ ํ‘œ์‹œ
for i in range(k):
    x,y = map(int,input().split())
    graph[x-1][y-1] = -1

# ์‹œ์ž‘์ , ๋์  : idx๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ˜๋ฉด, ์ฃผ์–ด์ง„ ๊ฐ’์€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 1์”ฉ ๋นผ์คŒ
start = list(map(int,input().split()))
start[0] -= 1
start[1] -= 1
end = list(map(int,input().split()))
end[0] -= 1
end[1] -= 1

Bfs()

๐ŸŽ„์ฝ”๋“œ ์„ค๋ช…

 ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค