문제 링크: https://www.acmicpc.net/problem/2146
백준 알고리즘 기초 2/2 602에서 3번째 - 2146번 다리 만들기를 풀어보았다.
C++
Python
from collections import deque
def island(a,b):
q=deque()
q.append([a,b])
while q:
x,y=q.popleft()
for (h,w) in [[1,0],[0,1],[-1,0],[0,-1]]:
dx,dy=x+h,y+w
if 0<=dx<n and 0<=dy<n and not visited[dx][dy] and inp[dx][dy]:
visited[dx][dy]=1
inp[dx][dy]=num
q.append([dx,dy])
def bfs(v):
q=deque()
dis=[[-1]*n for i in range(n)]
for i in range(n):
for j in range(n):
if inp[i][j]==v:
dis[i][j]=0
q.append([i,j])
while q:
x,y=q.popleft()
for (w,h) in [[1,0],[0,1],[-1,0],[0,-1]]:
dx,dy=x+w,y+h
if 0<=dx<n and 0<=dy<n:
if inp[dx][dy] and inp[dx][dy]!=v:
return dis[x][y]
elif (not inp[dx][dy]) and dis[dx][dy]==-1:
dis[dx][dy]=dis[x][y]+1
q.append([dx,dy])
return int(1e9)
n=int(input())
inp=[list(map(int,input().split())) for i in range(n)]
visited=[[0]*n for i in range(n)]
num=1
res=int(1e9)
for i in range(n):
for j in range(n):
if inp[i][j] and not visited[i][j]:
visited[i][j]=1
inp[i][j]=num
island(i,j)
num+=1
for i in range(1,num):
res=min(res,bfs(i))
print(res)
Java
'코테용 문제풀이 > 백준' 카테고리의 다른 글
숨바꼭질 4 풀이 (0) | 2023.02.08 |
---|---|
숨바꼭질 풀이 (0) | 2023.02.08 |
DFS 스페셜 저지 풀이 (0) | 2023.02.08 |
BFS 스페셜 저지 풀이 (0) | 2023.02.07 |
서울 지하철 2호선 풀이 (0) | 2023.02.07 |