#include int F, FF, K, I, J; int n, m; #define u f[n - 1][m] #define r f[n][m + 1] #define d f[n + 1][m] #define l f[n][m - 1] struct fields{ int N, M, B; int f[102][102]; } fi[101]; struct result{ int field, n, m, stay, length; char direction[10100]; } re[501]; int Scan(int f, int k, int s) { if (fi[f].u < 11) { fi[f].u = 22; re[k].direction[s] = 'U'; re[k].length++; n--; return 1; } if (fi[f].r < 11) { fi[f].r = 22; re[k].direction[s] = 'R'; re[k].length++; m++; return 1; } if (fi[f].d < 11) { fi[f].d = 22; re[k].direction[s] = 'D'; re[k].length++; n++; return 1; } if (fi[f].l < 11) { fi[f].l = 22; re[k].direction[s] = 'L'; re[k].length++; m--; return 1; } return 0; } int Verify(int f, int n, int m) { if (fi[f].u < 11 || fi[f].r < 11 || fi[f].d < 11 || fi[f].l < 11) return 1; return 0; } int Cell(int f, int n, int m) { if (fi[f].u == 22 && fi[f].r == 22 && fi[f].d == 22 && fi[f].l == 22)return 1; return 0; } char Append(int f) { if (fi[f].u < 10) if (Cell(f,n-1,m)) return'U'; if (fi[f].r < 10) if (Cell(f,n,m+1)) return'R'; if (fi[f].d < 10) if (Cell(f,n+1,m)) return'D'; if (fi[f].l < 10) if (Cell(f,n,m-1)) return'L'; return 0; } void OneField() { I = J = 1; for (int k = 1; k <= K; k++) { for (int i = 1; i <= fi[F].N; i++) { for (int j = 1; j <= fi[F].M; j++) { if (fi[F].f[i][j] < 10) { I = i; J = j; goto start_scan; } } } F++; if (F > FF)continue; else { k--; continue; } start_scan: re[k].field = F; re[k].n = I; re[k].m = J; fi[F].f[I][J] = 22; n = I; m = J; for (int s = 1; s < 20000; s++) { switch (Append(F)) { case'U': re[k].direction[s] = 'U'; re[k].direction[s+1] = 'D'; re[k].length += 2; s++; fi[F].u = 22; continue; case'R': re[k].direction[s] = 'R'; re[k].direction[s+1] = 'L'; re[k].length += 2; s++; fi[F].r = 22; continue; case'D': re[k].direction[s] = 'D'; re[k].direction[s+1] = 'U'; re[k].length += 2; s++; fi[F].d = 22; continue; case'L': re[k].direction[s] = 'L'; re[k].direction[s+1] = 'R'; re[k].length += 2; s++; fi[F].l = 22; continue; } if (Scan(F, k, s))continue; switch (re[k].direction[s - 1]) { case'U': if (Verify(F, n + 1, m)) { re[k].direction[s] = 'D'; re[k].length++; n++; s++; Scan(F, k, s); continue; } else break; case'R': if (Verify(F, n, m - 1)) { re[k].direction[s] = 'L'; re[k].length++; m--; s++; Scan(F, k, s); continue; } else break; case'D': if (Verify(F, n - 1, m)) { re[k].direction[s] = 'U'; re[k].length++; n--; s++; Scan(F, k, s); continue; } else break; case'L': if (Verify(F, n, m + 1)) { re[k].direction[s] = 'R'; re[k].length++; m++; s++; Scan(F, k, s); continue; } else break; } break; } if (re[k].length == 0)re[k].stay++; } } void Input() { FILE *in = fopen("catsdogs.in", "r"); fscanf(in, "%i %i\n", &FF, &K); char x; for (int i = 1; i <= FF; i++) { fscanf(in, "%i %i %i\n", &fi[i].N, &fi[i].M, &fi[i].B); for (int j = 1; j <= fi[i].N; j++) { for (int k = 1; k <= fi[i].M; k++) { fscanf(in, "%c", &x); if (x == 35) { fi[i].f[j][k] = 22; continue; } if (x == 46) { fi[i].f[j][k] = 10; continue; } fi[i].f[j][k] = x - 48; } fscanf(in, "\n"); } fscanf(in, "\n"); } for (int f = 1; f <= FF; f++) { for (int j = 0; j <= fi[f].M + 1; j++) { fi[f].f[0][j] = 22; fi[f].f[fi[f].N + 1][j] = 22; } for (int i = 1; i <= fi[f].N + 1; i++) { fi[f].f[i][0] = 22; fi[f].f[i][fi[f].M + 1] = 22; } } F = 1; } void Ouput() { FILE *out = fopen("catsdogs.out", "w"); for (int i = 1; i<=K; i++) { fprintf(out, "%i\n", re[i].field); if (re[i].field == 0) continue; fprintf(out, "%i %i\n", re[i].n, re[i].m); if (re[i].stay) { fprintf(out, "%s\n", "STAY"); continue; } for (int j = 1; j <= re[i].length; j++) { fprintf(out, "%c", re[i].direction[j]); } fprintf(out, "\n"); } } int main() { Input(); OneField(); Ouput(); return 0; }