512 - Spreadsheet Tracking


Spreadsheet Tracking
PS:この問題のレイアウトが面倒なので、ここでOJのウェブサイトを提供します:UVa 512-Spreadsheet Tracking
#include <stdio.h>
#include <string.h>
#define maxNum 10005
//  , ,   
int r, c, n;
struct Command {
    //    
    char c[5];
    // exchange    
    int r1, c1, r2, c2;
    // d,i    
    int a, x[20];
} cmd[maxNum];

int simulate(int *r0, int *c0) {
    for(int i = 0; i < n; i++) {
        // exchange
        if(cmd[i].c[0] == 'E') {
            if(cmd[i].r1 == *r0 && cmd[i].c1 == *c0) {
                *r0 = cmd[i].r2;
                *c0 = cmd[i].c2;
            } else if(cmd[i].r2 == *r0 && cmd[i].c2 == *c0) {
                *r0 = cmd[i].r1;
                *c0 = cmd[i].c1;
            }
        } else {
            // delete or insert
            // (r0,c0)      
            int dr = 0, dc = 0;
            for(int j = 0; j < cmd[i].a; j++) {
                //        
                int x = cmd[i].x[j];
                // insert
                if(cmd[i].c[0] == 'I') {
                    // insert row and less than r0
                    if(cmd[i].c[1] == 'R' && x <= *r0) {
                        dr++;
                    }
                    // insert column and less than c0
                    if(cmd[i].c[1] == 'C' && x <= *c0) {
                        dc++;
                    }
                } else {
                    // delete
                    // delete row and equal r0
                    if(cmd[i].c[1] == 'R' && x == *r0) {
                        return 0;
                    }
                    // delete row and less than r0
                    if(cmd[i].c[1] == 'R' && x < *r0) {
                        dr--;
                    }
                    // delete column and equal c0
                    if(cmd[i].c[1] == 'C' && x == *c0) {
                        return 0;
                    }
                    // delete column and less than c0
                    if(cmd[i].c[1] == 'C' && x < *c0) {
                        dc--;
                    }
                }
            }
            *r0 += dr;
            *c0 += dc;
        }
    }
    return 1;
}



int main() {
    //   cell ,  cell ,  cell  
    int r0, c0, q, kase = 0;
    while(scanf("%d%d%d", &r, &c, &n) == 3 && r) {
        for(int i = 0; i < n; i++) {
            scanf("%s", cmd[i].c);
            if(cmd[i].c[0] == 'E') {
                scanf("%d%d%d%d", &cmd[i].r1, &cmd[i].c1, &cmd[i].r2, &cmd[i].c2);
            } else {
                scanf("%d", &cmd[i].a);
                for(int j = 0; j < cmd[i].a; j++) {
                    scanf("%d", &cmd[i].x[j]);
                }
            }
        }

        if(kase > 0) {
            printf("
"
); } printf("Spreadsheet #%d
"
, ++kase); scanf("%d", &q); while(q--) { scanf("%d%d", &r0, &c0); printf("Cell data in (%d,%d) ", r0, c0); if(!simulate(&r0, &c0)) { printf("GONE
"
); } else { printf("moved to (%d,%d)
"
, r0, c0); } } } return 0; }