512 - Spreadsheet Tracking (UVA)

题目链接如下:

Online Judge

这道题还是很繁琐的,花了我不少时间……(然后看到别人的评价“水题”,就超级崩溃……)

刘汝佳用了两种方法来解,这里用的就是他的方法,还是非常巧妙的。 https://www.cnblogs.com/mofushaohua/p/7789533.html

我的解法比较笨拙,就是直接模拟,代码如下:

#include 
#include 
#include 
const int maxx = 51;

int r, c, n, kase, query, u, v, s, t, sz, newr, newc, p, temp;
int sp[maxx][maxx];
int row[maxx * maxx], col[maxx * maxx];
char c1, c2;

int main(){
    kase = 0;
    while(scanf("%d %d", &r, &c) == 2 && r && c){
        if(kase){
            printf("\n");
        }
        printf("Spreadsheet #%d\n", ++kase);
        newr = r;
        newc = c;
        scanf("%d", &n);
        std::fill(sp[0], sp[0] + maxx * maxx, 0);
        std::fill(row, row + maxx * maxx, 0);
        std::fill(col, col + maxx * maxx, 0);
        for(int i = 1; i <= r; ++i){
            for(int j = 1; j <= c; ++j){
                sp[i][j] = (i - 1) * c + j;
            }
        }
        while(n--){
            getchar();
            scanf("%c%c", &c1, &c2);
            if(c1 == 'E'){
                scanf("%d %d %d %d", &u, &v, &s, &t);
                std::swap(sp[u][v], sp[s][t]);
            } else{
                scanf("%d", &sz);
                std::vector vec(sz);
                for(int i = 0; i < sz; ++i){
                    scanf("%d", &vec[i]);
                }
                sort(vec.begin(), vec.end());
                if(c1 == 'D'){
                    p = 0;
                    if(c2 == 'C'){
                        newc -= sz;
                        for(int j = vec[0]; j <= newc; ++j){
                            while(p < sz && j + p == vec[p]){
                                p++;
                            }
                            for(int i = 1; i <= newr; ++i){
                                sp[i][j] = sp[i][j + p];
                            }
                        }
                    } else{
                        newr -= sz;
                        for(int i = vec[0]; i <= newr; ++i){
                            while(p < sz && i + p == vec[p]){
                                p++;
                            }
                            for(int j = 1; j <= newc; ++j){
                                sp[i][j] = sp[i + p][j];
                            }
                        }
                    }
                } else{
                    p = sz;
                    if(c2 == 'C'){
                        newc += sz;
                        for(int j = newc; j >= vec[0]; --j){
                            if(p > 0 && j - p < vec[p - 1]){
                                p--;
                                if(j <= maxx - 1){
                                    for(int i = 1; i <= newr; ++i){
                                        sp[i][j] = 0;
                                    }
                                }
                            } else{
                                if(j <= maxx - 1){
                                    for(int i = 1; i <= newr; ++i){
                                        sp[i][j] = sp[i][j - p];
                                    }
                                }
                            }
                        }
                        newc = std::min(maxx - 1, newc);
                    } else{
                        newr += sz;
                        for(int i = newr; i >= vec[0]; --i){
                            if(p > 0 && i - p < vec[p - 1]){
                                p--;
                                if(i <= maxx - 1){
                                    for(int j = 1; j <= newc; ++j){
                                        sp[i][j] = 0;
                                    }
                                }
                            } else{
                                if(i <= maxx - 1){
                                    for(int j = 1; j <= newc; ++j){
                                        sp[i][j] = sp[i - p][j];
                                    }
                                }
                            }
                        }
                        newr = std::min(maxx - 1, newr);
                    }
                }
            }
        }
        for(int i = 1; i <= newr; ++i){
            for(int j = 1; j <= newc; ++j){
                if(sp[i][j]){
                    row[sp[i][j]] = i;
                    col[sp[i][j]] = j;
                }
            }
        }
        scanf("%d", &query);
        while(query--){
            scanf("%d %d", &u, &v);
            temp = (u - 1) * c + v;
            if(row[temp] == 0){
                printf("Cell data in (%d,%d) GONE\n", u, v);
            } else{
                printf("Cell data in (%d,%d) moved to (%d,%d)\n", u, v, row[temp], col[temp]);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(UVA,算法)