fun main(args: Array<String>) {
if(args.isNotEmpty()) {
System.setIn(java.io.FileInputStream(args[0]))
}
if(args.size >= 2) {
System.setOut(java.io.PrintStream(args[1]))
}
val numTests = readLine()!!.toInt()
require(numTests in 1..100)
var sumN = 0
repeat(numTests) {
val (N, K) = readLine()!!.split(" ").map{ it.toInt() }
require(N in 1..100)
require(K in 1..N*N)
val H = List(N) { readLine()!!.split(" ").map{ it.toInt() - 1 } }
require(H.flatten().toSet() == (0 until K).toSet())
sumN += N
require(sumN <= 100)
val pos = List(K) { mutableListOf<Pair<Int,Int>>() }
for(i in 0 until N) for(j in 0 until N) pos[H[i][j]].add(Pair(i, j))
val tb = List(N) { IntArray(N) }
for(h in 0 until K-1) {
for((x2, y2) in pos[h+1]) {
var cur = N*N*K
for((x1
, y1
) in pos
[h
]) cur
= minOf
(cur
, tb
[x1
][y1
] + abs(x1
- x2
) + abs(y1
- y2
)) tb[x2][y2] = cur
}
}
println(pos[K-1].map{ (i, j) -> tb[i][j] }.min()!!)
}
require(readLine() == null)
}
aW1wb3J0IGtvdGxpbi5tYXRoLmFicwoKZnVuIG1haW4oYXJnczogQXJyYXk8U3RyaW5nPikgewogICAgaWYoYXJncy5pc05vdEVtcHR5KCkpIHsKICAgICAgICBTeXN0ZW0uc2V0SW4oamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oYXJnc1swXSkpCiAgICB9CiAgICBpZihhcmdzLnNpemUgPj0gMikgewogICAgICAgIFN5c3RlbS5zZXRPdXQoamF2YS5pby5QcmludFN0cmVhbShhcmdzWzFdKSkKICAgIH0KCiAgICB2YWwgbnVtVGVzdHMgPSByZWFkTGluZSgpISEudG9JbnQoKQogICAgcmVxdWlyZShudW1UZXN0cyBpbiAxLi4xMDApCgogICAgdmFyIHN1bU4gPSAwCiAgICByZXBlYXQobnVtVGVzdHMpIHsKICAgICAgICB2YWwgKE4sIEspID0gcmVhZExpbmUoKSEhLnNwbGl0KCIgIikubWFweyBpdC50b0ludCgpIH0KICAgICAgICByZXF1aXJlKE4gaW4gMS4uMTAwKQogICAgICAgIHJlcXVpcmUoSyBpbiAxLi5OKk4pCiAgICAgICAgdmFsIEggPSBMaXN0KE4pIHsgcmVhZExpbmUoKSEhLnNwbGl0KCIgIikubWFweyBpdC50b0ludCgpIC0gMSB9IH0KICAgICAgICByZXF1aXJlKEguZmxhdHRlbigpLnRvU2V0KCkgPT0gKDAgdW50aWwgSykudG9TZXQoKSkKCiAgICAgICAgc3VtTiArPSBOCiAgICAgICAgcmVxdWlyZShzdW1OIDw9IDEwMCkKCiAgICAgICAgdmFsIHBvcyA9IExpc3QoSykgeyBtdXRhYmxlTGlzdE9mPFBhaXI8SW50LEludD4+KCkgfQogICAgICAgIGZvcihpIGluIDAgdW50aWwgTikgZm9yKGogaW4gMCB1bnRpbCBOKSBwb3NbSFtpXVtqXV0uYWRkKFBhaXIoaSwgaikpCgogICAgICAgIHZhbCB0YiA9IExpc3QoTikgeyBJbnRBcnJheShOKSB9CiAgICAgICAgZm9yKGggaW4gMCB1bnRpbCBLLTEpIHsKICAgICAgICAgICAgZm9yKCh4MiwgeTIpIGluIHBvc1toKzFdKSB7CiAgICAgICAgICAgICAgICB2YXIgY3VyID0gTipOKksKICAgICAgICAgICAgICAgIGZvcigoeDEsIHkxKSBpbiBwb3NbaF0pIGN1ciA9IG1pbk9mKGN1ciwgdGJbeDFdW3kxXSArIGFicyh4MSAtIHgyKSArIGFicyh5MSAtIHkyKSkKICAgICAgICAgICAgICAgIHRiW3gyXVt5Ml0gPSBjdXIKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnRsbihwb3NbSy0xXS5tYXB7IChpLCBqKSAtPiB0YltpXVtqXSB9Lm1pbigpISEpCiAgICB9CgogICAgcmVxdWlyZShyZWFkTGluZSgpID09IG51bGwpCgp9