본문 바로가기
알고리즘

[Swift 알고리즘] 백준 7562 - 나이트의 이동

by 코코종 2022. 3. 30.
728x90

안녕하세요 코코종입니다!

오늘은 BFS문제인 나이트의 이동을 풀어보겠습니다.

 

https://www.acmicpc.net/problem/7562

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

//
//  main.swift
//  Algorithm
//
//  Created by kokojong on 2022/03/29.
//


// 7562 나이트의 이동
import Foundation

let n = Int(readLine()!)!

for _ in (0..<n) {
    
    let l = Int(readLine()!)!
    
    var board = Array(repeating: Array(repeating: 0, count: l), count: l) // l * l
    
    let now = readLine()!.components(separatedBy: " ").map({Int($0)!})
    let c1 = now[0]
    let r1 = now[1]
    
    let to = readLine()!.components(separatedBy: " ").map({Int($0)!})
    let c2 = to[0]
    let r2 = to[1]
    
    var queue : [[Int]] = []
    
    let dc = [1, 2, 2, 1, -1, -2, -2, -1] // x좌표 c
    let dr = [-2, -1, 1, 2, 2, 1, -1, -2] // y좌표 r
    
    queue.append([c1, r1])
    board[c1][r1] = 0
    
    var index = 0
    
    while queue.count > index {
        let q = queue[index]
        
        let c = q[0]
        let r = q[1]
        
        index += 1
        
        if r == r2 && c == c2 {
//            print("도착",board[c][r],c,r)
            print(board[c][r])
            break
        }
        
        for i in 0..<8 {
            let cc = c + dc[i]
            let rr = r + dr[i]
            
            if cc <= l-1 && cc >= 0 && rr >= 0 && rr <= l-1 {
                
                if board[cc][rr] == 0 {
                    board[cc][rr] = board[c][r] + 1
                    queue.append([cc,rr])
                }
                
            }
        }
    }
    
    
}

 


 

이 문제는BFS의 대표적인 문제를 살짝 변형했다고 보이네요!

원래는 미궁처럼 상하좌우만 이동했다면 이번에는 8가지 움직임이 있습니다.

기본적인 아이디어는 같고 저같은 경우에는 index오류가 발생해서 rr과 cc를 먼저 체크하고 그 안에서 board[cc][rr]에 대한 체크를 했습니다. x y로 처음에 하다가 헷갈려서 r c로 좌표의 이름을 바꿨더니 훨씬 덜 헷갈리게 되었습니다!

 

어제 풀었던 '벽 부수고 이동하기' 보다 훨씬 쉬워서 금~방 풀었네요 ㅎㅎ 그럼 20000~~

728x90