UVa 512 - Spreadsheet Tracking

来源:互联网 发布:淘宝服装行业的利润 编辑:程序博客网 时间:2024/06/05 15:38

有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1~r,列从左到右编号为1~c。如图4-2(a)所示,如果先删除第1、5行,然后删除第3, 6, 7, 9列,结果如图4-2(b)所示。


接下来在第2、3、5行前各插入一个空行,然后在第3列前插入一个空列,会得到如图4-3所示结果。

你的任务是模拟这样的n个操作。具体来说一共有5种操作:
1.EX r1 c1 r2 c2交换单元格(r1,c1),(r2,c2)。
2.<command> A x1 x2 … xA 插入或删除A行或列(DC-删除列,DR-删除行,IC-插入列,IR-插入行,1≤A≤10)。
在插入/删除指令后,各个x值不同,且顺序任意。接下来是q个查询,每个查询格式为“r c”,表示查询原始表格的单元格(r,c)。对于每个查询,输出操作执行完后该单元格的新位置。输入保证在任意时刻行列数均不超过50。

#include<stdio.h>#include<string.h>#define maxn 10000struct Command {   char c[5];   int r1, c1, r2, c2;   int a, x[20];} cmd[maxn];int r, c, n;int simulate(int* r0, int* c0){  for(int i = 0; i < n; i++)   {   if(cmd[i].c[0] == 'E')    {    if(cmd[i].r1 == *r0 && cmd[i].c1 == *c0) { *r0 = cmd[i].r2; *c0 = cmd[i].c2; }else if(cmd[i].r2 == *r0 && cmd[i].c2 == *c0) { *r0 = cmd[i].r1; *c0 = cmd[i].c1;}   }   else    {     int dr = 0, dc = 0;     for(int j = 0; j < cmd[i].a; j++)  {       int x = cmd[i].x[j];       if(cmd[i].c[0] == 'I')    {         if(cmd[i].c[1] == 'R' && x <= *r0) dr++;         if(cmd[i].c[1] == 'C' && x <= *c0) dc++;       }       else    {         if(cmd[i].c[1] == 'R' && x == *r0) return 0;         if(cmd[i].c[1] == 'C' && x == *c0) return 0;         if(cmd[i].c[1] == 'R' && x < *r0) dr--;         if(cmd[i].c[1] == 'C' && x < *c0) dc--;        }      }     *r0 += dr; *c0 += dc;    }  }   return 1;}int main() {  int r0, c0, q, kase = 0;  while(scanf("%d%d%d", &r, &c, &n) == 3 && r)   {     for(int i = 0; i < n; i++)  {      scanf("%s", cmd[i].c);      if(cmd[i].c[0] == 'E')   {        scanf("%d%d%d%d", &cmd[i].r1, &cmd[i].c1, &cmd[i].r2, &cmd[i].c2);      }   else   {        scanf("%d", &cmd[i].a);        for(int j = 0; j < cmd[i].a; j++)  scanf("%d", &cmd[i].x[j]);      }     }     if(kase > 0) printf("\n");     printf("Spreadsheet #%d\n", ++kase);     scanf("%d", &q);     while(q--)  {        scanf("%d%d", &r0, &c0);        printf("Cell data in (%d,%d) ", r0, c0);        if(!simulate(&r0, &c0)) printf("GONE\n");        else printf("moved to (%d,%d)\n", r0, c0);     }  }  return 0;}



0 0
原创粉丝点击