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) | 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;
}