#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define PROFILE_START(i) clock_t start##i = clock() #define PROFILE_STOP(i) fprintf(stderr, "elapsed time (" #i ") = %f\n", double(clock() - start##i) / CLOCKS_PER_SEC) typedef long long ll; typedef unsigned long long ull; typedef vector vi; typedef pair pii; typedef pair pll; #define fi first #define se second #define pb push_back #define eb emplace_back #define em emplace #define mp make_pair #define mt make_tuple enum { UL, UR, R, LR, LL, L }; #define DXN 6 int gDX[][2] = { // (dx r, dx c) { -2, -1 }, { -2, 1 }, { 0, 2 }, { 2, 1 }, { 2, -1 }, { 0, -2 } }; const char* gDS[] = { "UL", "UR", "R", "LR", "LL", "L" }; #define INF 0x3f3f3f3f int main(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, sr, sc, tr, tc; cin >> n >> sr >> sc >> tr >> tc; //(distance, dir, row, col) vector>> dp(n, vector>(n, make_pair(INF, -1))); queue> Q; Q.emplace(0, -1, sr, sc); while (!Q.empty()) { int cd = get<0>(Q.front()); int cp = get<1>(Q.front()); int cr = get<2>(Q.front()); int cc = get<3>(Q.front()); Q.pop(); if (dp[cr][cc].first != INF) continue; dp[cr][cc].first = cd; dp[cr][cc].second = cp; for (int i = 0; i < DXN; i++) { int r = cr + gDX[i][0]; int c = cc + gDX[i][1]; if (r < 0 || r >= n || c < 0 || c >= n) continue; Q.emplace(cd + 1, i, r, c); } } if (dp[tr][tc].first == INF) { cout << "Impossible" << endl; } else { vector ans; int r = tr, c = tc; while (dp[r][c].second >= 0) { ans.push_back(dp[r][c].second); int newR = r - gDX[dp[r][c].second][0]; int newC = c - gDX[dp[r][c].second][1]; r = newR; c = newC; } reverse(ans.begin(), ans.end()); cout << ans.size() << endl; cout << gDS[ans[0]]; for (int i = 1; i < (int)ans.size(); i++) cout << " " << gDS[ans[i]]; cout << endl; } return 0; }