import java.io.* import java.util.* fun main(args: Array) { val n = readLine()!!.toInt() val positions = readLine()!!.split(' ').map(String::toInt) val (i_start, j_start, i_end, j_end) = positions val start = Point(i_start, j_start) val end = Point(i_end, j_end) val board = Board(n, start, end, emptyList()) solveBoard(board) if (solution.isNotEmpty()) { println(solution.size) println(solution.joinToString(" ")) } else { println("Impossible") } } var solution = emptyList() fun solveBoard(board: Board): Board { if(board.done()){ return board } if(solution.isEmpty() || board.movements.size < solution.size){ for (movement in movements) { if (movement.canMove(board) && movement.gettingClose(board)) { val newBoard = solveBoard(movement.move(board)) if (newBoard.done()) { if (solution.isEmpty() || newBoard.movements.size < solution.size){ solution = newBoard.movements } break } } } } return board } val movements = listOf(Movements.UL, Movements.UR, Movements.R, Movements.LR, Movements.LL, Movements.L) data class Point(val i: Int, val j: Int) { fun distance(p: Point) = Math.sqrt(((i - p.i)*(i - p.i) + (j - p.j)*(j - p.j)).toDouble()) fun inBoard(size: Int) = i in (0..size) && j in (0..size) } data class Board(val size: Int, val currentPos: Point, val end: Point, val movements: List) { fun done() = currentPos == end } enum class Movements(private val movement: (Point) -> Point) { UL({ it.copy(i = it.i - 2, j = it.j - 1) }), UR({ it.copy(i = it.i - 2, j = it.j + 1) }), R({ it.copy(j = it.j + 2) }), LR({ it.copy(i = it.i + 2, j = it.j + 1) }), LL({ it.copy(i = it.i + 2, j = it.j - 1) }), L({ it.copy(j = it.j - 2) }); fun canMove(board: Board) = movement(board.currentPos).inBoard(board.size) fun gettingClose(board: Board) = board.currentPos.distance(board.end) > movement(board.currentPos).distance(board.end) fun move(board: Board) = board.copy(currentPos = movement(board.currentPos), movements = board.movements + listOf(this)) }