Spreadsheet Tracking UVA - 512

题目链接:https://vjudge.net/problem/UVA-512
Spreadsheet Tracking UVA - 512Spreadsheet Tracking UVA - 512Spreadsheet Tracking UVA - 512
题目大意:有一个r行c列(r>=1, c<=50)的电子表格,行从上到下编号为1-r,列从左到右编号为1-c,。如图所示(a),如果先删除第1,5行,然后删除第3,6,7,9列,结果如图(b)

(a) A B C D E F G H I
1 22 55 66 77 88 99 10 12 14
2 2 24 6 8 22 12 14 16 18
3 18 19 20 21 22 23 24 25 26
4 24 25 26 67 22 69 70 71 77
5 68 78 79 80 22 25 28 29 30
6 16 12 11 10 22 56 57 58 59
7 33 34 35 36 22 38 39 40 41
(b) A B C D E
1 2 24 8 22 16
2 18 19 21 22 25
3 24 25 67 22 71
4 16 12 10 22 58
5 33 34 36 22 40

接下来再第2,3,5行前插入一个空行,然后在第3列插入一个空列,会得到如图c

(c) A B C D E
1 2 24 8 22 16
2
3 18 19 21 22 25
4
5 24 25 67 22 71
6 16 12 10 22 58
7
8 33 34 36 22 40

你的任务是模拟这样的n个操作。具体来说一共有五个操作:
EX r1,r2,c1,c2交换单元格(r1,c1)(r2,c2)
A x1,x2,x3…xa插入或删除A列或行(DC-删除列),(DR-删除行),(IC-插入列),(IR-插入行)
在插入/删除指令后,各个x值不同,且顺序任意,接下来q个查询,每个格式为”r,c“,表示查询原始表格单元格(r,c)。输出操作执行完后该单元格新位置。
解析:
模拟算法,使用多个二维数组进行模拟操作。书写复制函数,用来复制一行或一列。删除操作为除了要删除的行(列)复制其他行(列)。插入操作为复制一个空行。最后遍历查找即可。

代码:

#include <stdio.h>
#include <string.h>
#define maxn 100
#define maxnn 10000
int arr[maxn][maxn], arr2[maxn][maxn], flag[maxn];
int r,c;

void fz(char ch, int t1, int t2) {
    if(ch=='R') {
        for(int i = 1; i <= c; i++)
            arr[t1][i] = arr2[t2][i];
    }
    else {
        for(int i = 1; i <= r; i++)
            arr[i][t1] = arr2[i][t2];
    }
}

void Delete(char ch) {
    memcpy(arr2, arr, sizeof(arr));
    int f = ch=='R'?r:c, cnt = 0;
    for(int i = 1; i <= f; i++)
        if(!flag[i]) fz(ch, ++cnt, i);
    if(ch=='R') r = cnt;
    else c = cnt;
}

void Insert(char ch) {
    memcpy(arr2, arr, sizeof(arr));
    int f = ch=='R'?r:c, cnt = 0;
    for(int i = 1; i <= f; i++) {
        if(flag[i]) fz(ch, ++cnt, 0);
        fz(ch, ++cnt ,i);
    }
    if(ch=='R') r = cnt;
    else c = cnt;
}
int main()
{
    int m,n,rnd = 0,x,r1,r2,c1,c2;
    char str[10];
    while(scanf("%d%d%d",&r,&c,&n) && r) {
        if(rnd++) printf("\n");
        printf("Spreadsheet #%d\n",rnd);
        memset(arr, 0, sizeof(arr));
        memset(arr2, 0, sizeof(arr2));
        for(int i = 1; i <= r; i++) {
            for(int j = 1; j <= c; j++)
                arr[i][j] = i*maxnn+j;
        }
        while(n--) {
            scanf("%s",str);
            if(!strcmp(str,"EX")) {
                scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
                int t = arr[r1][c1];
                arr[r1][c1] = arr[r2][c2];
                arr[r2][c2] = t;
            }
            else {
                memset(flag, 0, sizeof(flag));
                scanf("%d",&m);
                while(m--) { scanf("%d",&x); flag[x] = 1;}
                if(str[0]=='D') Delete(str[1]);
                else Insert(str[1]);
            }
        }
        scanf("%d",&n);
        while(n--) {
            int fg = 0,i,j;
            scanf("%d%d",&r1,&c1);
            printf("Cell data in (%d,%d) ",r1,c1);
            for(i = 1; i <= r; i++) {
                for(j = 1; j<= c; j++) {
                    if(arr[i][j]==r1*maxnn+c1) {
                        fg = 1;
                        break;
                    }
                }
                if(fg) break;
            }
            if(!fg) printf("GONE\n");
            else printf("moved to (%d,%d)\n",i,j);
        }
    }
    return 0;
}