fun main(args: Array) { val (n,v,ox, oy) = readLine()!!.split(" ").map { it.toInt() } val map = mutableListOf>() val list = mutableListOf() val step = MutableList>(n*n, { MutableList(n*n, {null}) }) for(i in 1..n) { val temp = readLine()!!.split(" ").map { it.toInt() } val temp2 = mutableListOf() for(j in temp.indices) { temp2.add(Pos(list.size + temp2.size, j, i-1, temp[j])) } list.addAll(temp2) map.add(temp2) } for(i in list.indices) { for(j in list.indices) { for(k in list.indices) { if(j == k) { step[j][k] = 0 continue } val objJ = list[j] val objK = list[k] if((objJ.x == objK.x && Math.abs(objJ.y - objK.y) == 1) || (objJ.y == objK.y && Math.abs(objJ.x - objK.x) == 1)) { step[j][k] = objK.value } step[j][i]?.let { val part1 = it step[i][k]?.let { val part2 = it step[j][k]?.also { if(part1 + part2 < it) { step[j][k] = part1 + part2 } } ?: run { step[j][k] = part1 + part2 } } } } } } // スタートからゴール直通 var canGoal:Boolean? = null val notUseOasis = step[0].last()!! if(notUseOasis < v) { canGoal = true } var oasis:Pos? = null if(ox > 0 && oy > 0) { oasis = map[oy-1][ox-1] } var useOasis = notUseOasis if(oasis != null) { val temp1 = step[0][oasis.id] var vital = v if(temp1!! >= v) { vital = 0 } else { vital = (v - temp1!!)*2 } val temp2 = step[oasis.id].last()!! canGoal = vital > temp2 } val ans = if(canGoal!!) "YES" else "NO" println(ans) } class Pos(val id:Int, val x:Int, val y:Int, val value:Int)