✅ BFS ✅ 최단경로
최단거리 문제이므로 BFS 사용
bool map[301][301]
int dist[301][301]
queue<pair<int, int>> que
dx[8] = {1,2,-1,-2,-1,-2,1,2}
dy[8] = {2,1,2,1,-2,-1,-2,-1}
BFS(){
while(!que.empty){
x = que.front.second
y = que.front.first
que.pop
for(i : 0 ~ 7){
nx = x + dx[i]
ny = y + dy[i]
if(nx < 0 || ny < 0 || nx >= l || ny >= l) continue
if(map[ny][nx] == true) continue // 이미 지나왔던 위치일 경우
que.push({ny, nx})
map[ny][nx] = true
dist[ny][nx] = dist[y][x] + 1
if(ny == tx && nx == ty){ // 좌표를 뒤집어서 생각했기 때문에 ny와 tx 비교, nx와 ty 비교 (1743 음식물 피하기 포스팅 설명 참고)
cout << dist[ny][nx]
return
}
}
}
}
main(){
cin >> T // 테스트케이스
while(T--){
cin >> l // 체스판 한 변의 길이
cin >> sx >> sy // 시작(start) 위치
cin >> tx >> ty // 목표(target) 위치
que.push({sx, sy})
map[sx][sy] = true // 다시 돌아올 경우 방지하기 위해, 시작위치 map에 표시
BFS()
while(!que.empty) que.pop // que 초기화
}
}
O(N^2)
이동 가능한 경로가 상하좌우가 아니었던 점 (풀이는 동일)
시작점과 목표지점이 정해져 있는 문제라는 점 정도.?
특별한건 없었음
유의할 점은 BFS에서 입력받은 좌표를 뒤집어서 생각했기 때문에 ny와 tx 비교, nx와 ty 비교 해야 한다는 점
( 1743 음식물 피하기 설명 참고 )