1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | import sys from collections import deque input = sys.stdin.readline M, N, H = map(int, input().split()) dx = [-1, 0, 0, 1, 0, 0] dy = [0, -1, 0, 0, 1, 0] dz = [0, 0, -1, 0, 0, 1] board = [[list(map(int, input().split())) for _ in range(N)] for _ in range(H)] def bfs(): q = deque() for i in range(H): for j in range(N): for k in range(M): if board[i][j][k] == 1: q.append((i, j, k)) while q: x, y, z, = q.popleft() for n in range(6): nx = x + dx[n] ny = y + dy[n] nz = z + dz[n] if 0 <= nx < H and 0 <= ny < N and 0 <= nz < M and not board[nx][ny][nz]: board[nx][ny][nz] = board[x][y][z] + 1 q.append((nx, ny, nz)) bfs() ans = float("-inf") for i in range(H): for j in range(N): for k in range(M): if board[i][j][k] == 0: ans = float("inf") ans = max(ans, board[i][j][k]) if ans == float("inf"): print("-1") else: print(ans - 1) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import sys from collections import deque input = sys.stdin.readline M, N, H = map(int, input().split()) dx = [-1, 0, 0, 1, 0, 0] dy = [0, -1, 0, 0, 1, 0] dz = [0, 0, -1, 0, 0, 1] board = [[list(map(int, input().split())) for _ in range(N)] for _ in range(H)] def bfs(a, b, c): q = deque() q.append((a, b, c)) while q: x, y, z = q.popleft() for i in range(6): nx = x + dx[i] ny = y + dy[i] nz = z + dz[i] if 0 <= nx < H and 0 <= ny < N and 0 <= nz < M and board[nx][ny][nz] == 0: board[nx][ny][nz] = board[x][y][z] + 1 q.append((nx, ny, nz)) for i in range(H): for j in range(N): for k in range(M): if board[i][j][k] == 1: bfs(i, j, k) ans = float("-inf") for i in range(H): for j in range(N): for k in range(M): if board[i][j][k] == 0: ans = float("inf") ans = max(ans, board[i][j][k]) if ans == float("inf"): print("-1") else: print(ans - 1) | cs |
30번 ~ 34번 코드를 bfs() 함수 안으로 넣기만 했을 뿐인데
아래 코드 제출시 오답, 위에 코드 제출시 정답입니다.
도대체 무슨 차이가 있는 건가요 ????
아 문제는 토마토
https://www.acmicpc.net/problem/7569
입니다.
아래 코드는 익은 토마토가 2개 이상 있을 때 첫 토마토 기준으로 거리를 먼저 계산해 버리잖아. M, N, H = 5, 1, 1일 때 1 0 0 0 1 같은거 넣고 bfs 끝난 직후에 board print해보면 알 수 있을 듯
아 미친 그걸 생각 못했네요 ... BFS에서 시작점이 여러개면 큐에 한 번에 넣고 돌려야 한 다는 걸 잊고 있었네요 ㅠㅠㅠ 이런 실수를 하다니 ... 너무 감사합니다 ㅠㅠㅠ