#include #include #include #include #include using namespace std; int N, T; vector> A; int curr_r = 0, curr_c = 0; long long s = 0; string ops = ""; void move_to(int tr, int tc) { while (curr_r < tr && ops.length() < T) { ops += "D"; curr_r++; } while (curr_r > tr && ops.length() < T) { ops += "U"; curr_r--; } while (curr_c < tc && ops.length() < T) { ops += "R"; curr_c++; } while (curr_c > tc && ops.length() < T) { ops += "L"; curr_c--; } } // ジグザグ順で次に進むべき座標を取得する関数 pair get_next_zigzag(int r, int c) { // 現在の進む方向を判定(偶数行は右、奇数行は左) if (r % 2 == 0) { if (c + 1 < N) return {r, c + 1}; else return {r + 1, c}; } else { if (c - 1 >= 0) return {r, c - 1}; else return {r + 1, c}; } } int main() { if (!(cin >> N >> T)) return 0; A.assign(N, vector(N)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cin >> A[i][j]; } for (int bit = 19; bit >= 0; --bit) { if (ops.length() >= T) break; // 1. sを更新する (C) bool s_updated = false; if (((s >> bit) & 1) == 0) { // 最も近い「対象ビットが1になるマス」を探して移動し、C int best_r = -1, best_c = -1; int min_dist = 10000; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if ((((s ^ A[i][j]) >> bit) & 1) == 1) { int d = abs(curr_r - i) + abs(curr_c - j); if (d < min_dist) { min_dist = d; best_r = i; best_c = j; } } } } if (best_r != -1) { move_to(best_r, best_c); if (ops.length() < T) { ops += "C"; s ^= A[curr_r][curr_c]; s_updated = true; } } } // 2. pへ移動する // bitが奇数なら(0,0)、偶数なら(N-1,N-1) int pr = (bit % 2 != 0) ? 0 : N - 1; int pc = (bit % 2 != 0) ? 0 : N - 1; move_to(pr, pc); // 3. ジグザグに行動 (W) int r = curr_r, c = curr_c; while (ops.length() < T) { if (((A[r][c] >> bit) & 1) == 0) { if ((A[r][c] ^ s) > A[r][c]) { // ここでW ops += "W"; A[r][c] ^= s; } } // 次のマスへ if (r == N - 1 && ( (r%2==0 && c==N-1) || (r%2!=0 && c==0) )) break; pair next = get_next_zigzag(r, c); move_to(next.first, next.second); r = curr_r; c = curr_c; } } for(char c : ops){ cout << c << endl; } return 0; }