2589 보물섬

     

    import sys
    from collections import deque
    input = sys.stdin.readline
    s, g = map(int, input().split())
    maps = []
    for _ in range(s):
    maps.append(list(input()))
    dxdy = [(0,1), (0,-1), (1,0), (-1,0)]
    def bfs(i,j):
    q = deque()
    q.append((i, j))
    visited = [[False]* g for _ in range(s)]
    visited[i][j] = 1
    length = 0
    while q:
    x, y = q.popleft()
    for i in range(4):
    dx = dxdy[i][0]
    dy = dxdy[i][1]
    nx = x + dx
    ny = y + dy
    if nx < 0 or nx >= s or ny < 0 or ny >= g:
    continue
    elif maps[nx][ny] == 'L' and visited[nx][ny] == False:
    visited[nx][ny] = visited[x][y] + 1
    length = max(length, visited[nx][ny])
    q.append((nx, ny))
    return length - 1
    ans = 0
    for i in range(s):
    for j in range(g):
    if maps[i][j] == 'L':
    ans = max(ans, bfs(i, j))
    print(ans)

     

    2636 치즈

    import sys
    from collections import deque
    input = sys.stdin.readline
    s, g = map(int, input().split())
    che = []
    cnt = 0
    dxdy = [(0,1), (0,-1), (1,0), (-1,0)]
    for i in range(s):
    che.append(list(map(int, input().split())))
    cnt += sum(che[i])
    def bfs():
    q = deque()
    q.append((0, 0))
    bye = deque()
    visited = [[False]*g for _ in range(s)]
    while q:
    x, y = q.popleft()
    for i in range(4):
    dx = dxdy[i][0]
    dy = dxdy[i][1]
    nx = x + dx
    ny = y + dy
    if 0 <= nx < s and 0 <= ny < g and not visited[nx][ny]:
    visited[nx][ny] = 1
    if che[nx][ny] == 0:
    q.append((nx, ny))
    elif che[nx][ny] == 1:
    bye.append((nx, ny))
    for x, y in bye:
    che[x][y] = 0
    return len(bye)
    time = 1
    while True:
    byecnt = bfs()
    cnt -= byecnt
    if cnt == 0:
    print(time)
    print(byecnt)
    break
    time += 1

     

    5427 불

    import sys
    from collections import deque
    input = sys.stdin.readline
    dx = [1,0,-1,0]
    dy = [0,1,0,-1]
    def bfs():
    time = 0
    while q:
    time += 1
    while fire and fire[0][2] < time:
    x, y, t = fire.popleft()
    for i in range(4):
    nx = x + dx[i]
    ny = y + dy[i]
    if 0<=nx<h and 0<=ny<w:
    if maps[nx][ny] == '.' or maps[nx][ny] == '@':
    maps[nx][ny] = '*'
    fire.append((nx, ny, t + 1))
    while q and q[0][2] < time:
    x, y, t = q.popleft()
    for i in range(4):
    nx = x + dx[i]
    ny = y + dy[i]
    if 0<=nx<h and 0<=ny<w:
    if maps[nx][ny] == '.' and not visited[nx][ny]:
    visited[nx][ny] = True
    q.append((nx, ny, t + 1))
    else:
    return time
    return 'IMPOSSIBLE'
    T = int(input())
    for _ in range(T):
    w, h = map(int, input().split())
    q = deque() # 나
    fire = deque() # 불
    maps = []
    visited = [[False]*w for _ in range(h)]
    for i in range(h):
    maps.append(list(input()))
    for j in range(w):
    if maps[i][j] == '@':
    visited[i][j] = True
    q.append((i,j,0))
    elif maps[i][j] == '*':
    fire.append((i,j,0))
    print(bfs())

     

    9205 맥주 마시면서 걸어가기

    import sys
    from collections import deque
    input = sys.stdin.readline
    def bfs():
    q = deque()
    q.append([start[0], start[1]])
    while q:
    x, y = q.popleft()
    if abs(x-fe[0]) + abs(y-fe[1]) <= 1000:
    print('happy')
    return
    for i in range(n):
    if not visited[i]:
    newx, newy = shop[i]
    if abs(x-newx) + abs(y-newy) <= 1000:
    q.append([newx, newy])
    visited[i] = True
    print('sad')
    return
    t = int(input())
    for _ in range(t):
    n = int(input())
    start = [int(x) for x in input().split()]
    shop = []
    for j in range(n):
    x, y = map(int, input().split())
    shop.append([x, y])
    fe = [int(x) for x in input().split()]
    visited = [False for _ in range(n+1)]
    bfs()

     

    13913 숨바꼭질 4

     

    import sys
    from collections import deque
    input = sys.stdin.readline
    n, k = map(int, input().split())
    visited = [-1] * 100001
    path = []
    def bfs(start, target):
    q = deque()
    q.append((n, 0))
    visited[start] = start
    while q:
    cur, time = q.popleft()
    if cur == target:
    idx = cur
    while idx != start:
    path.append(idx)
    idx = visited[idx]
    path.append(start)
    return time
    if cur + 1 < 100001 and visited[cur + 1] == -1:
    q.append((cur+1, time + 1))
    visited[cur+1] = cur
    if cur - 1 >= 0 and visited[cur-1] == -1:
    q.append((cur-1, time + 1))
    visited[cur-1] = cur
    if cur*2 < 100001 and visited[cur*2] == -1:
    q.append((cur*2, time + 1))
    visited[cur*2] = cur
    print(bfs(n, k))
    print(*path[::-1])

     

     

    17836 공주님을 구해라!

     
    import sys
    from collections import deque
    input = sys.stdin.readline
    INF = int(1e9)
    n, m, t = map(int, input().split())
    maps = []
    for _ in range(n):
    maps.append(list(map(int, input().split())))
    visited = [[False for _ in range(m)] for _ in range(n)]
    dxdy =[[1,0], [-1,0], [0,1], [0,-1]]
    res = INF
    q = deque()
    q.append((0,0,0))
    visited[0][0] = True
    while q:
    x, y, d = q.popleft()
    if x == n-1 and y == m-1:
    res = min(res, d)
    break
    if d+1 > t:
    break
    for i in dxdy:
    nx, ny = i[0] + x, i[1] + y
    if (-1<nx<n and -1<ny<m) and not visited[nx][ny]:
    if not maps[nx][ny]:
    visited[nx][ny] = True
    q.append((nx, ny, d+1))
    elif maps[nx][ny] == 1:
    continue
    elif maps[nx][ny] == 2:
    tmp = d + 1
    tmp += abs(n-1-nx) + abs(m-1-ny)
    visited[nx][ny] = True
    if tmp <= t:
    res = tmp
    if res > t:
    print('Fail')
    else:
    print(res)

    Posted by 저본