#include #include using namespace std; using namespace atcoder; using ll = long long; constexpr ll mod = 1e9 + 7; constexpr ll INF = (1LL << 62) - (1LL << 31) - 1; #define REP(i, init, n) for(int i = (int)(init); i < (int)(n); i++) #define RREP(i, init, n) for(int i = (int)(init); i >= (int)(n); i--) #define All(A) A.begin(), A.end() #define rAll(A) A.rbegin(), A.rend() #define vi vector #define vl vector #define vvi vector> #define vvl vector> #define pint pair #define plong pair int N, T; vvi A; int calc_dist(const pint &a, const pint &b) { return abs(a.first - b.first) + abs(a.second - b.second); } void move_U(pint &cur, string &ans) { cur.first--; ans += 'U'; } void move_D(pint &cur, string &ans) { cur.first++; ans += 'D'; } void move_L(pint &cur, string &ans) { cur.second--; ans += 'L'; } void move_R(pint &cur, string &ans) { cur.second++; ans += 'R'; } void write(int &s, pint &cur, string &ans) { A[cur.first][cur.second] ^= s; ans += 'W'; } void copy(int &s, pint &cur, string &ans) { s ^= A[cur.first][cur.second]; ans += 'C'; } void move(pint &cur, const pint &next, string &ans) { while(cur != next) { if(cur.first < next.first) { move_D(cur, ans); } else if(cur.first > next.first) { move_U(cur, ans); } else if(cur.second < next.second) { move_R(cur, ans); } else if(cur.second > next.second) { move_L(cur, ans); } } } void solve() { pint cur = {0, 0}; int s = 0; int move_count = 0; string ans = ""; vector shelters; vvi shelters_map(N, vi(N, 0)); RREP(b, 19, 0) { int mask = (1 << b); int min_dist = 100; pint next_target = {-1, -1}; // cerr << "cur: " << cur.first << " " << cur.second << " s: " << s << " mask: " << bitset<20>(mask) << endl; REP(i, 0, N) { REP(j, 0, N) { if(shelters_map[i][j] == 1) continue; if(s & mask) { if((A[i][j] & mask) == 0) { int dist = calc_dist(cur, {i, j}); if(dist < min_dist) { min_dist = dist; next_target = {i, j}; } } } else { if(A[i][j] & mask) { int dist = calc_dist(cur, {i, j}); if(dist < min_dist) { min_dist = dist; next_target = {i, j}; } } } } } // cerr << "next_target: " << next_target.first << " " << next_target.second << endl; if(next_target.first == -1) { break; } move(cur, next_target, ans); copy(s, cur, ans); if(ans.size() >= T) break; // cerr << b << " " << cur.first << " " << cur.second << " " << s << endl; // cerr << bitset<20>(s) << endl; vvi board(N, vi(N, 0)); int rest = 0; REP(i, 0, N) { REP(j, 0, N) { if(A[i][j] & mask) { board[i][j] = 1; } else { rest++; } } } /* REP(i, 0, N) { REP(j, 0, N) { cerr << board[i][j] << " "; } cerr << endl; } */ for(const auto &shelter : shelters) { if(board[shelter.first][shelter.second] == 1) { continue; } move(cur, shelter, ans); if(ans.size() >= T) break; write(s, cur, ans); board[cur.first][cur.second] = 1; rest--; } if(ans.size() >= T) break; while(rest > 0) { int min_dist = 100; pint next = {-1, -1}; REP(i, 0, N) { REP(j, 0, N) { if(board[i][j] == 0) { int dist = calc_dist(cur, {i, j}); if(dist < min_dist) { min_dist = dist; next = {i, j}; } } } } if(next.first == -1) { break; // No more targets } move(cur, next, ans); if(ans.size() >= T) break; if(b < 19 && rest == 1) { shelters.push_back(cur); shelters_map[cur.first][cur.second] = 1; copy(s, cur, ans); break; } write(s, cur, ans); board[next.first][next.second] = 1; rest--; } /* REP(i, 0, N) { REP(j, 0, N) { cerr << board[i][j] << " "; } cerr << endl; } REP(i, 0, N) { REP(j, 0, N) { cerr << bitset<20>(A[i][j]) << " "; } cerr << endl; } */ if(ans.size() >= T) break; } if(ans.size() >= T) { ans = ans.substr(0, T); } for(char c: ans) { cout << c << endl; } } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cin >> N >> T; A.resize(N, vi(N)); REP(i, 0, N) { REP(j, 0, N) { cin >> A[i][j]; } } solve(); }