0315 BFS

누디·2023년 3월 15일
0

알고리즘

목록 보기
3/5

백준 문제 풀이

2589 보물섬

from collections import deque

n,m=map(int, input().split())
maps=[]
for i in range(n):
  maps.append(list(input()))

dx=[1,-1,0,0]
dy=[0,0,1,-1]

def bfs(i,j):
  queue=deque()
  queue.append((i,j))
  visited=[[0]*m for _ in range(n)]
  visited[i][j]=1
  cnt=0
  while queue:
    x,y=queue.popleft()
    for i in range(4):
      nx=x+dx[i]
      ny=y+dy[i]
      if nx<0 or nx>=n or ny<0 or ny>=m:
        continue
      elif maps[nx][ny]=='L' and visited[nx][ny]==0:
        visited[nx][ny]=visited[x][y]+1
        cnt=max(cnt,visited[nx][ny])
        queue.append((nx,ny))
  return cnt-1

result=0
for i in range(n):
  for j in range(m):
    if maps[i][j]=='L':
      result=max(result,bfs(i,j))

print(result)

2636 치즈

import sys
from collections import deque
def input():
    return sys.stdin.readline().rstrip()

def bfs():
    q = deque([(0, 0)])
    melt = deque([])
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
                visited[nx][ny] = 1
                if cheeze[nx][ny] == 0:
                    q.append((nx, ny))
                elif cheeze[nx][ny] == 1:
                    melt.append((nx, ny))
                    
    for x, y in melt:
        cheeze[x][y] = 0
    return len(melt)

n, m = map(int, input().split())
cheeze = []
cnt = 0
for i in range(n):
    cheeze.append(list(map(int, input().split())))
    cnt += sum(cheeze[i])
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

time = 1
while True:
    visited = [[0] * m for _ in range(n)]
    meltCnt = bfs()
    cnt -= meltCnt
    if cnt == 0:
        print(time, meltCnt, sep='\n')
        break
    time += 1

5427 불

from collections import deque
import sys

input = sys.stdin.readline

dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]

def bfs():
    cnt = 0
    while q:
        cnt += 1
        while fire and fire[0][2] < cnt:
            x, y, time = fire.popleft()
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if 0 <= nx < h and 0 <= ny < w:
                    if board[nx][ny] == "." or board[nx][ny] == "@":
                        board[nx][ny] = "*"
                        fire.append((nx, ny, time + 1))

        while q and q[0][2] < cnt:
            x, y, time = q.popleft()
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if 0 <= nx < h and 0 <= ny < w:
                    if board[nx][ny] == "." and not visited[nx][ny]:
                        visited[nx][ny] = True
                        q.append((nx, ny, time + 1))
                else:
                    return cnt

    return "IMPOSSIBLE"

if __name__ == "__main__":
    t = int(input())
    for _ in range(t):
        w, h = map(int, input().split())

        q = deque()
        fire = deque()

        board = []
        visited = [[False] * w for _ in range(h)]
        for i in range(h):
            board.append(list(input().strip()))
            for j in range(w):
                if board[i][j] == "@":
                    visited[i][j] = True
                    q.append((i, j, 0))
                elif board[i][j] == "*":
                    fire.append((i, j, 0))

        print(bfs())

9205 맥주 마시면서 걸어가기

from collections import deque

def bfs():
    q = deque()
    q.append((home_x,home_y))
    while q:
        x,y = q.popleft()
        if abs(x-festival_x) + abs(y-festival_y) <= 1000:
            print('happy')
            return
        for i in range(n):
            if not visited[i]:
                new_x,new_y = graph[i]
                if abs(x-new_x) + abs(y-new_y) <= 1000:
                    visited[i] = 1
                    q.append((new_x,new_y))
    print('sad')
    return

t = int(input())

for _ in range(t):
    n = int(input())
    home_x,home_y = map(int,input().split())
    graph = []
    for _ in range(n):
        x,y = map(int,input().split())
        graph.append((x,y))
    festival_x,festival_y = map(int,input().split())
    visited = [0 for _ in range(n+1)]
    bfs()

13913 숨바꼭질 4

from collections import deque

def bfs():
    q = deque()
    q.append(n)
    while q:
        v = q.popleft()
        if v == k:
            print(visited[v])
            ans = []

            while v != n:
                ans.append(v)
                v = path[v]
            ans.append(n)
            ans.reverse()
            print(' '.join(map(str, ans)))
            return
        for next_step in (v-1, v+1, v*2):
            if 0 <= next_step < MAX and not visited[next_step]:
                visited[next_step] = visited[v] + 1
                q.append(next_step)
                path[next_step] = v

n, k = map(int, input().split())
MAX = 100001
visited = [0] * MAX
path = [0] * MAX
bfs()

17836 공주님을 구해라!

import sys
from collections import deque
input = sys.stdin.readline

def bfs(x, y, dst_x, dst_y, time):
    q = deque([(x, y, time)])
    visited = [[0] * m for _ in range(n)]
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    while q:
        x, y, time = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] != 1 and not visited[nx][ny]:
                if nx == dst_x and ny == dst_y:
                    return time+1
                visited[nx][ny] = 1
                q.append((nx, ny, time+1))
    return float('inf')

n, m, t = map(int, input().split())
graph = [[] for _ in range(n)]
for i in range(n):
    graph[i] = list(map(int, input().split()))
    if 2 in graph[i]:
        knife = [i, graph[i].index(2)]

not_use_knife = bfs(0, 0, n-1, m-1, 0)

tmp = bfs(0, 0, knife[0], knife[1], 0)
if tmp != float('inf'):
    use_knife = tmp + abs(n-1 - knife[0]) + abs(m-1 - knife[1])
else:
    use_knife = tmp
ans = min(not_use_knife, use_knife)
print(ans if ans <= t else 'Fail')

0개의 댓글