Spreadsheet Tracking UVA - 512

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

(a)ABCDEFGHI
1225566778899101214
2224682212141618
3181920212223242526
4242526672269707177
5687879802225282930
6161211102256575859
7333435362238394041
(b)ABCDE
122482216
21819212225
32425672271
41612102258
53334362240

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

(c)ABCDE
122482216
2
31819212225
4
52425672271
61612102258
7
83334362240

你的任务是模拟这样的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值