/* Sat Oct 25 02:01:23 JST 2003 */ #include #include #define WIDTH 128 #define LEFTMOST(x,y) ((map[y][x].n>0)&&((x)==0||((x)>0&&map[y][x-1].n==0))) #define TAIL(x,y) ((x)>0&&map[y][x].n==0&&map[y][x-1].n>0) #define MOVABLETO(xx,yy) ((xx)>=0&&(yy)>=0&&((map[yy][xx].n>0)||(map[yy][xx-1].n>0))) typedef struct _char_t { unsigned char c; int n; } char_t; char_t map[WIDTH][WIDTH]; void output(int _x, int _y) { int x, y; printf("(%d,%d)\n", _x, _y); for (y = 5; y >= 0; y--) { for (x = 0; x < 10; x++) { if (x == _x && _y == y) { if (map[y][x].n == 0) printf("-[0] "); else printf("%c[%d] ", map[y][x].c, map[y][x].n); } else { if (map[y][x].n == 0) printf("-(0) "); else printf("%c(%d) ", map[y][x].c, map[y][x].n); } } printf("\n"); } } int searchtail(int x, int y) { int i, target; target = map[y][x].n; for (i = x; i < WIDTH; i++) { if (map[y][i].n != target) return i; } return -1; } int current(int cx, int cy) { if (cx == 0) { return map[cy][cx].n; } if (map[cy][cx-1].n == 0) { return map[cy][cx].n; } return map[cy][cx-1].n; } int fall(int x1, int x2, int y, int *cx, int *cy) { int x; char_t tmp; if (y == 0) return 0; if (x1 <= *cx && *cx <= x2+1 && y == *cy && current(*cx, *cy) == map[y][x1].n) { (*cy)--; } for (x = x1; x <= x2; x++) { tmp = map[y][x]; if (tmp.n == 0) return 0; map[y][x] = map[y-1][x]; map[y-1][x] = tmp; } return 1; } int floating(int x1, int x2, int y) { int x; if (y == 0) return 0; for (x = x1; x <= x2; x++) { if (map[y-1][x].n > 0) { return 0; } } return 1; } int fallsearch(int *cx, int *cy) { int x, x2, y; int target, fallen = 0; for (y = 0; y < WIDTH; y++) { for (x = 0; x < WIDTH; x++) { if (map[y][x].n > 0) { target = map[y][x].n; for (x2 = x; x2 < WIDTH; x2++) { if (map[y][x2].n != target) { break; } } if (x2 >= WIDTH) { break; } if (floating(x, x2-1, y)) { fall(x, x2-1, y, cx, cy); fallen = 1; } x = x2-1; } } } return fallen; } void concatenate() { int x, x2, y; int max = (WIDTH-1), maxtmp, target; for (y = 0; y < WIDTH; y++) { for (x = 0; x <= max; x++) { if (map[y][x].n > 0) { for (x2 = x; ; x2++) { if (map[y][x2].n == 0) { break; } map[y][x2].n = map[y][x].n; } x = x2-1; maxtmp = x+1; } } max = maxtmp; } } int delete(int *x, int *y) { int i; if (TAIL(*x, *y)) { return 0; } for (i = 0; ; i++) { if (map[*y][*x+i].n == 0) { break; } map[*y][*x+i] = map[*y][*x+i+1]; } if (map[*y][*x].n == 0 && !TAIL(*x, *y)) { (*y)--; /* Notice! */ if (*y < 0) { return 0; } if (map[*y][*x].n == 0 && !TAIL(*x, *y)) { return 0; } } return 1; } void leftmost(int *x, int *y) { int target; if (TAIL(*x,*y)) { (*x)--; } for (; (*x) >= 0; (*x)--) { if (map[*y][*x].n == 0) { (*x)++; break; } } if ((*x) < 0) *x = 0; } int main() { int i, j, k, len; char s[WIDTH]; int session, loop; int index; int x, y; int error; int target; gets(s); session = atoi(s); for (loop = 0; loop < session; loop++) { index = 1; x = 1; y = 0; error = 0; gets(s); len = strlen(s); for (i = 0; i < WIDTH; i++) { for (j = 0; j < WIDTH; j++) { map[i][j].c = '\0'; map[i][j].n = 0; } } map[0][0].c = s[0]; map[0][0].n = 1; for (i = 1; i < len; i++) { switch (s[i]) { case 'F': if (TAIL(x,y)) { error = 1; break; } x++; break; case 'B': if (LEFTMOST(x,y)) { error = 1; break; } x--; break; case 'P': if (!MOVABLETO(x,y+1)) { error = 1; break; } y++; break; case 'N': if (!MOVABLETO(x,y-1)) { error = 1; break; } y--; break; case 'D': if (!delete(&x, &y)) { error = 1; break; } break; case 'C': if (TAIL(x,y)) { error = 1; break; } if (map[y+1][x].n > 0) { error = 1; break; } map[y+1][x].c = map[y][x].c; map[y+1][x].n = ++index; y++; x++; break; default: if (!(('0' <= s[i] && s[i] <= '9') || ('a' <= s[i] && s[i] <= 'z'))) { error = 1; break; } for (j = 0; ; j++) { if (TAIL(x+j,y)) break; } map[y][x].n = map[y][x+j-1].n; for (; j > 0; j--) { map[y][x+j] = map[y][x+j-1]; } map[y][x].c = s[i]; x++; break; } if (error) break; while (1) { if (!fallsearch(&x, &y)) { break; } } concatenate(); /*printf("%c -> ", s[i]);*/ /*output(x,y);*/ } /* printf("%s -> ", s);*/ if (error) printf("ERROR\n"); else { leftmost(&x, &y); target = map[y][x].n; for (i = 0; map[y][x+i].n == target; i++) { printf("%c", map[y][x+i].c); } printf("\n"); } } return 0; }