알고스팟

임정우·2023년 1월 22일

코딩테스트

목록 보기
5/10

아직 푸는 중입니다.

생각한 방법은 뚫린 곳(0으로 표시된 곳)은 bfs로 탐색하고, 벽이 있으면(1로 표시) 오른쪽, 아래쪽 벽을 뚫어서 길로(0으로) 바꿉니다.
m,n을 bfs로 지나칠 때까지 반복합니다.

반례
6 5
001011
111100
110110
101000
000010

이 케이스에서 (지나온 길을 8로 표시, -1은 보기 불편함)

x,y : 0 1
deque([(1, 1), (0, 2)])
[8, 8, 0, 0, 1, 1]
[1, 0, 1, 1, 0, 0]
[1, 1, 0, 1, 1, 0]
[1, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 1, 0]
x,y : 0 2
deque([(1, 2)])
[8, 8, 8, 8, 1, 1]
[1, 0, 0, 1, 0, 0]
[1, 1, 0, 1, 1, 0]
[1, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 1, 0]

이렇게 되는데, 내가 생각한 대로 짜였다면

[8, 8, 8, 8, 0, 1]
[1, 0, 1, 0, 0, 0]
[1, 1, 0, 1, 1, 0]
[1, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 1, 0]

이 되어야 합니다.

어디가 잘못되었는지 확인하고 빠른 시일내에 업데이트하겠습니다 :)

from collections import deque

m,n = map(int, input().split())
graph = []

for i in range(n):
    graph.append(list(map(int,input())))

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

graph[0][0] = 8 # 지나온 길은 8로 표시
def bfs(x,y):
    queue = deque()
    queue.append((x,y))
    wall = 0
    count = 1
    while graph[n-1][m-1] == 0:
        
        flag = False
        while queue:
            x, y = queue.popleft()
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]        
                if nx >= n or ny >= m or nx < 0 or ny < 0:
                    continue
                if graph[nx][ny] != 0:
                    continue
                graph[nx][ny] = 8
                queue.append((nx,ny))
                    
        if graph[n-1][m-1] == 8:
            break
            
        for i in [1,3]:
            nx = x + dx[i]
            ny = y + dy[i]        
            if nx >= n or ny >= m or nx < 0 or ny < 0:
                continue
            if graph[nx][ny] == 1:
                graph[nx][ny] = 0
                flag = True
                queue.append((nx,ny))
            
        if flag == True:
            wall += 1
        
        print("**********after**********")
        print("x,y :", x,y)
        print(queue)
        for i in range(n):
            print(graph[i])
        print("\n")
        
        count += 1
        if count > 10:
            break
    return wall

print(bfs(0,0))
profile
경희대학교 소프트웨어융합학과

0개의 댓글