题目链接如下:
这道题还是很繁琐的,花了我不少时间……(然后看到别人的评价“水题”,就超级崩溃……)
刘汝佳用了两种方法来解,这里用的就是他的方法,还是非常巧妙的。 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<int> 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;
- }