#include using namespace std; typedef long long ll; const ll MAX_OP = 1000; ll N, T; vector> grid; ll cnt = 0; ll x = 0, y = 0; ll s = 0; bool move(ll ex, ll ey) { ll dx = ex - x; ll dy = ey - y; if (cnt + abs(dx) + abs(dy) > MAX_OP) return false; while (dx != 0) { cout << (dx > 0 ? "R" : "L") << "\n"; x += (dx > 0 ? 1 : -1); dx += (dx > 0 ? -1 : 1); cnt++; } while (dy != 0) { cout << (dy > 0 ? "D" : "U") << "\n"; y += (dy > 0 ? 1 : -1); dy += (dy > 0 ? -1 : 1); cnt++; } return true; } bool copy() { if (cnt + 1 > MAX_OP) return false; s ^= grid[y][x]; cout << "C\n"; cnt++; return true; } bool write() { if (cnt + 1 > MAX_OP) return false; ll old_val = grid[y][x]; ll new_val = old_val ^ s; if (new_val > old_val) { grid[y][x] = new_val; cout << "W\n"; cnt++; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> T; grid.resize(N, vector(N)); for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) cin >> grid[i][j]; // 方針:高ビットを持つマスにsをコピーして、低ビットを持つマスにXORして書き換える vector> cells; // {bitcount, y, x} for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) cells.emplace_back(__builtin_popcountll(grid[i][j]), i, j); // 高ビットから順に処理 sort(cells.rbegin(), cells.rend()); for (auto [bitc, sy, sx] : cells) { if (!move(sx, sy)) break; if (!copy()) break; // 近いマスを探索してXORした方が良くなるものを書き換える vector> delta_list; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { ll before = grid[i][j]; ll after = before ^ s; if (after > before) delta_list.emplace_back(after - before, i, j); } } // スコアの増加が大きい順に処理 sort(delta_list.rbegin(), delta_list.rend()); for (auto [delta, ty, tx] : delta_list) { if (!move(tx, ty)) goto END; if (!write()) goto END; } } END: return 0; }