using System; using System.Collections.Generic; using System.IO; using System.Linq; class Solution { enum MoveType { UL, UR, R, LR, LL, L } static int[] ShiftI = new int[6] {-2, -2, 0, 2, 2, 0}; static int[] ShiftJ = new int[6] { -1, 1, 2, 1, -1, -2 }; static int Dist(int i1, int j1, int i2, int j2) { int i = i2 - i1; int j = j2 - j1; return i * i + j * j; } static void printShortestPath(int n, int i_start, int j_start, int i_end, int j_end) { // Print the distance along with the sequence of moves. if (i_start < 0 || i_start >= n || j_start < 0 || j_start >= n || i_end < 0 || i_end >= n || j_end < 0 || j_end >= n) { Console.WriteLine("Impossible"); return; } var dist = Dist(i_start, j_start, i_end, j_end); int curi = i_start; int curj = j_start; Stack moves = new Stack(); while (dist > 0) { int minDist = int.MaxValue; int minIdx = -1; for (int i = 0; i < 6; ++i) { var newi = curi + ShiftI[i]; var newj = curj + ShiftJ[i]; var distNew = Dist(newi, newj, i_end, j_end); if (distNew < minDist) { minDist = distNew; minIdx = i; } } if (minDist < dist) { var newi = curi + ShiftI[minIdx]; var newj = curj + ShiftJ[minIdx]; moves.Push((MoveType)minIdx); dist = minDist; curi = newi; curj = newj; } else { Console.WriteLine("Impossible"); return; } } if (moves.Count > 0) { Console.WriteLine(moves.Count); var res = moves.ToList(); res.Sort(); Console.WriteLine(string.Join(" ", res)); } else Console.WriteLine("Impossible"); } static void Main(String[] args) { int n = Convert.ToInt32(Console.ReadLine()); string[] tokens_i_start = Console.ReadLine().Split(' '); int i_start = Convert.ToInt32(tokens_i_start[0]); int j_start = Convert.ToInt32(tokens_i_start[1]); int i_end = Convert.ToInt32(tokens_i_start[2]); int j_end = Convert.ToInt32(tokens_i_start[3]); printShortestPath(n, i_start, j_start, i_end, j_end); } }