UVA 512 Spreadsheet Tracking

 1 #include "stdio.h"
 2 #include "string.h"
 3 #define maxd 10000
 4 int r,c,n;
 5 struct Command{
 6     char c[5];//操作,比如EX,IR
 7     int r1,c1,r2,c2;// EX交换的坐标
 8     int a,x[20];//a:每次操作的操作次数(非EX),比如 IR 2 1 5,插入1和5,a=2
 9     //x[20],记录每次操作对应的内容,也就是上面的1 5
10 }cmd[maxd];
11 int simulate(int *r0,int *c0)
12 {
13     for(int i=0;i<n;i++)
14     {
15         if(cmd[i].c[0]=='E')//交换操作
16         {
17             if(cmd[i].r1==*r0&&cmd[i].c1==*c0)//要交换的是查找的数
18             {
19                 *r0=cmd[i].r2;
20                 *c0=cmd[i].c2;
21             }
22             else if(cmd[i].r2==*r0&&cmd[i].c2==*c0)//查找的是要被交换的数
23             {
24                 *r0=cmd[i].r1;
25                 *c0=cmd[i].c1;
26             }
27         }
28         else
29         {
30             int dr=0,dc=0;//dr要修改的行 dc要修改的列
31             for(int j=0;j<cmd[i].a;j++)
32             {
33                 int x=cmd[i].x[j];
34                 if(cmd[i].c[0]=='I')//插入
35                 {
36                     if(cmd[i].c[1]=='R'&&x<=*r0)//插入列,且插入在*r0及其前面才需要管
37                         dr++;
38                     if(cmd[i].c[1]=='C'&&x<=*c0)
39                         dc++;
40                 }
41                 else//删除
42                 {
43                     if(cmd[i].c[1]=='R'&&x==*r0)//要查询的行被删除
44                         return 0;
45                     if(cmd[i].c[1]=='C'&&x==*c0)//要查询的列被删除
46                         return 0;
47                     if(cmd[i].c[1]=='R'&&x<*r0)
48                         dr--;
49                     if(cmd[i].c[1]=='C'&&x<*c0)
50                         dc--;
51                 }
52             }
53             *r0+=dr;
54             *c0+=dc;
55         }
56     }
57     return 1;
58 }
59 int main()
60 {
61     int r0,c0,kase=0,q;
62     while(scanf("%d%d%d",&r,&c,&n)==3&&r)//输入行列和操作次数n
63     {
64         for(int i=0;i<n;i++)
65         {
66             scanf("%s",cmd[i].c);
67             if(cmd[i].c[0]=='E')//EX操作为交换
68             {
69                 //输入交换的两组坐标
70                 scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);
71             }
72             else
73             {
74                 scanf("%d",&cmd[i].a);//输入操作数目
75                 for(int j=0;j<cmd[i].a;j++)
76                 {
77                     scanf("%d",&cmd[i].x[j]);
78                 }
79             }
80         }
81         if(kase>0)
82             printf("\n");
83         printf("Spreadsheet #%d\n",++kase);
84         scanf("%d",&q);//输入查询次数
85         while(q--)
86         {
87             scanf("%d%d",&r0,&c0);
88             printf("Cell data in (%d,%d) ",r0,c0);
89             if(!simulate(&r0,&c0))
90                 printf("GONE\n");
91             else
92                 printf("moved to (%d,%d)\n",r0,c0);
93         }
94     }
95     return 0;
96 }

 

posted @ 2019-01-23 20:53  付玬熙  阅读(98)  评论(0编辑  收藏  举报