#include #include #include #include #define REP(i,n) for ((i)=0; (i) < (n); (i)++ ) using namespace std; struct pos { int x; int y; pos() { x = -1; y = -1; } }; string moveNames[6] = { "UL","UR","R","LR","LL","L" }; int dx[6] = {-1,1,2,1,-1,-2}; int dy[6] = { -2,-2,0,2,2,0}; string getMoveName(pos from, pos to) { int i; int _dx = to.x - from.x; int _dy = to.y - from.y; REP(i, 6) if (dx[i] == _dx && dy[i] == _dy) { return moveNames[i]; } return ""; } int main() { pos start; pos end; int i, n; cin >> n; cin >> start.y >> start.x >> end.y >> end.x; pos **prev = new pos*[n]; REP(i, n) prev[i] = new pos[n]; queue bfs; pos cur; cur.x = start.x; cur.y = start.y; prev[start.x][start.y].x = -2; bfs.push(cur); while (!bfs.empty()) { cur = bfs.front(); bfs.pop(); if (cur.x == end.x && cur.y == end.y) { break; } REP(i, 6) { pos newpos; newpos.x = cur.x + dx[i]; newpos.y = cur.y + dy[i]; if (newpos.x >= 0 && newpos.x < n && newpos.y >= 0 && newpos.y < n && prev[newpos.x][newpos.y].x == -1) { prev[newpos.x][newpos.y].x = cur.x; prev[newpos.x][newpos.y].y = cur.y; bfs.push(newpos); } } } if (end.x >= 0 && end.x < n && end.y >= 0 && end.y < n && prev[end.x][end.y].x >= 0) { pos p; cur.x = end.x; cur.y = end.y; stack ans; do { p.x = prev[cur.x][cur.y].x; p.y = prev[cur.x][cur.y].y; ans.push(getMoveName(p, cur)); cur.x = p.x; cur.y = p.y; } while (!(cur.x == start.x && cur.y == start.y)); cout << ans.size() << endl; while (!ans.empty()) { cout << ans.top() << " "; ans.pop(); } cout << endl; } else { cout << "Impossible" << endl; } REP(i, n) delete[] prev[i]; delete[] prev; return 0; }