World Finals >> 1997 - San Jose
问题链接:。
问题简述:这是一个电子表格操作的模拟题。先输入电子表格总的行和列的正整数r和c,满足r,c<=50,r和c均为0时,输入测试实例结束;然后输入命令数n,跟着是n条命令,包括:
1. EX r1 c1 r2 c2,其含义是两个单元交换,即<r1,c1>和<r2,c2>内容交换;
2. 插入和删除命令,共4条,分别是DC(删除列)、DR(删除行)、IC(插入列)和IR(插入行),其格式如下:
< command > A x1 x2 . . . xA
其中,A为正整数,值小于10,指定其后列表xi的元素个数;列表x为删除或插入的行或列(是行还是列由命令决定)。
然后输入一个单元数,其后跟着若干个单元(r,c),r和c分别是单元的行和列坐标。对于每一个单元坐标,计算输出执行上面的命令序列之后,左边变为多少?
问题分析:采用先读入命令序列,再进行重复模拟的工作方式,相对而言比较易于理解和实现。程序说明:结构数组cmd[]用于存储电子表格命令,枚举语句(enum operation {EX, DC, DR, IC, IR};)用于将命令转换为整数形式,函数simulate()用于模拟命令的执行。
AC的C语言程序如下:
/* UVALive5198 UVA512 Spreadsheet Tracking */#include#include #define MAXN 50#define MAXN2 10#define MAXN3 10000int grid[MAXN+1][MAXN+1];enum operation {EX, DC, DR, IC, IR};struct { int cmd; int a, x[MAXN2+1];} cmd[MAXN3];int ccount;int cmp(const void *a,const void *b){ return *(int*)a - *(int*)b;}void getax(int index){ int i; scanf("%d", &cmd[index].a); for(i=0; i