https://www.acmicpc.net/problem/6146
좌푯값에 음수가 포함되어 있어, 그대로 거리 계산을 하는 데 문제가 있다.
따라서 입력되는 모든 좌표에 +500을 하여 전체 음수 범위를 양수로 전환하여 문제를 해결했다.
import java.io.File
import java.util.StringTokenizer
// input
private var br = System.`in`.bufferedReader()
// variables
private var X = 0
private var Y = 0
private var N = 0
private data class Coordinate(val x: Int, val y: Int, val dist: Int = 0)
private val dirX = intArrayOf(-1, 0, 1, 0)
private val dirY = intArrayOf(0, 1, 0, -1)
private lateinit var isVisited: Array<BooleanArray>
private const val MAX = 1001
fun main() {
val bw = System.out.bufferedWriter()
input()
bw.write(solve())
bw.close()
} // End of main()
private fun solve(): String {
val sb = StringBuilder()
sb.append(BFS())
return sb.toString()
} // End of solve()
private fun BFS(): Int {
val que = ArrayDeque<Coordinate>()
que.addLast(Coordinate(500, 500, 0))
isVisited[500][500] = true
while (que.isNotEmpty()) {
val cur = que.removeFirst()
if (cur.x == X && cur.y == Y) return cur.dist
for (i in 0 until 4) {
val nX = dirX[i] + cur.x
val nY = dirY[i] + cur.y
if (isVisited[nX][nY]) continue
if (!isAbleCheck(nX, nY)) continue
que.addLast(Coordinate(nX, nY, cur.dist + 1))
isVisited[nX][nY] = true
}
}
return 0
} // End of BFS()
private fun isAbleCheck(x: Int, y: Int): Boolean {
return x in 0 until MAX && y in 0 until MAX
} // End of isAbleCheck()
private fun input() {
var st = StringTokenizer(br.readLine())
X = st.nextToken().toInt() + 500
Y = st.nextToken().toInt() + 500
N = st.nextToken().toInt()
isVisited = Array(MAX) { BooleanArray(MAX) }
repeat(N) {
st = StringTokenizer(br.readLine())
val a = st.nextToken().toInt() + 500
val b = st.nextToken().toInt() + 500
isVisited[a][b] = true
}
} // End of input()