경험의 기록

문제

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

 

7562번: 나이트의 이동

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

www.acmicpc.net

 

풀이

0. 문제 해석

위와 같이 8방향에 대하여 BFS 탐색을 진행하면서

목적지에 도달하면 즉시 bfs의 레벨을 리턴한다.

2021.03.21 - [알고리즘, 자료구조/기본] - [알고리즘] 코틀린 BFS(너비우선탐색) 의 level 구하기

 

[알고리즘] 코틀린 BFS(너비우선탐색) 의 level 구하기

BFS는 하나로 시작 정점을 방문한 후 시작 정점에 인접한 모든 정점들을 우선 방문하는 방법이다. 코드로 구현할 때에는 큐를 이용해서 구현하는데, 시작점을 큐에 삽입하고, 큐를 반환하면서 다

hanyeop.tistory.com

레벨은 위와 같은 방식으로 구하였다.

 

1. 전체 코드

// [백준] 7562. 나이트의 이동 (Kotlin)
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

data class Pair(val x: Int, val y: Int)

var l = 0
lateinit var cur : Pair
lateinit var des : Pair
lateinit var visit : Array<Array<Boolean>>
val dx = arrayListOf(-1,-2,-2,-1,1,2,2,1)
val dy = arrayListOf(-2,-1,1,2,2,1,-1,-2)

fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
    val test = readLine().toInt()

    repeat(test){
        l = readLine().toInt()
        val (x1,y1) = readLine().split(" ").map { it.toInt() }
        cur = Pair(x1,y1)
        val (x2,y2) = readLine().split(" ").map { it.toInt() }
        des = Pair(x2,y2)
        visit = Array(l){ Array(l){ false } }

        println(bfs())
    }
}

fun bfs() : Int{
    // 처음부터 시작점과 목적지가 같으면
    if(cur == des){
        return 0
    }
    val q : Queue<Pair> = LinkedList()
    q.offer(cur) // 시작점 삽입
    visit[cur.x][cur.y] = true

    var count = 1
    while(q.isNotEmpty()){
        val size = q.size
        for(i in 0 until size){
            val curPair = q.poll()

            for(i in 0 until 8){
                val curX = curPair.x + dx[i]
                val curY = curPair.y + dy[i]

                // 범위 벗어나면
                if(curX < 0 || curX >= l || curY < 0 || curY >= l){
                    continue
                }
                // 이미 방문한 위치라면
                if(visit[curX][curY]){
                    continue
                }
                // 목적지에 도달하면 리턴
                if(curX == des.x && curY == des.y){
                    return count
                }

                // 방문처리하고 큐에 삽입
                visit[curX][curY] = true
                q.offer(Pair(curX,curY))
            }
        }
        count++
    }

    return -1
}
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading