NxN 크기의 미로에서 출발지 목적지가 주어진다.
이때 최소 몇 개의 칸을 지나면 출발지에서 도착지에 다다를 수 있는지 알아내는 프로그램을 작성하시오.
경로가 있는 경우 출발에서 도착까지 가는데 지나야 하는 최소한의 칸 수를, 경로가 없는 경우 0을 출력한다.
다음은 5x5 미로의 예이다. 1은 벽, 0은 통로를 나타내며 미로 밖으로 벗어나서는 안된다.
13101
10101
10101
10101
10021
마지막 줄의 2에서 출발해서 0인 통로를 따라 이동하면 맨 윗줄의 3에 5개의 칸을 지나 도착할 수 있다.
첫 줄에 테스트 케이스 개수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 미로의 크기 N과 N개의 줄에 걸쳐 미로의 통로와 벽에 대한 정보가 주어진다. 5<=N<=100
0은 통로, 1은 벽, 2는 출발, 3은 도착이다.
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
bfs를 사용하되, 갈수있는 곳을 저장해주는 lst에 좌표만이 아닌 출발점과의 거리변수 count를 추가해서 [count,(x,y)]형태로 저장해준다.
그 후에 3을 만나면 result에 count-1값을 넣어주고 출력해준다.
T = int(input())
search = [(-1, 0), (1, 0), (0, -1), (0, 1)]
for test_case in range(1, T+1):
N = int(input())
maze = [list(map(int, input())) for _ in range(N)]
#출발점 찾기
for i in range(N):
for j in range(N):
if maze[i][j] == 2:
first_y = i
first_x = j
lst = [] #여기에 갈수있는곳 저장할예정
count = 0
lst.append([count, (first_y, first_x)])
result = 0
while lst: #더이상 갈곳이 없으면 멈춰야함
temp = lst.pop(0)
count = temp[0]+1
lst_y = temp[1][0]
lst_x = temp[1][1]
maze[lst_y][lst_x] = 1 # 현재위치를 방문했다로 표시.
for i in range(4): #현재위치의 상하좌우 다보기 [(-1, 0), (1, 0), (0, -1), (0, 1)]
#상하좌우 확인
y = lst_y + search[i][0] #-1,0,1
x = lst_x + search[i][1] #-1,0,1
#print(y,x)
if y<0 or x<0 or y>=N or x>=N:
continue
if maze[y][x] == 0:
lst.append([count, (y, x)])
#print(lst)
elif maze[y][x] == 3:
result = count-1
break
else:
continue
print(f'#{test_case} {result}')