紫书第四章练习题 UVA512 Spreadsheet Tracking by 15 anruoxin

时间:2021-06-18 00:12:08

题意 :

有一个r行c列的电子表格,对其进行n个操作。操作类型分为5种:

1. 删除行 

2. 删除列 

3. 插入行 

4. 插入列 

5. 交换两个元素位置

输入初始查找位置,输出经过n个操作后,变更的位置;

解题:

将每一个操作用结构体保存下来,然后对每一个点进行这些操作。删除行,可以先记录比当前这个点小的行有多少,最后进行更新(减去这些行的数量)。

比如,删除行操作,假设当前点是(4,8),假设删除的行有1,2;比4 小的有两个,最后这点更新得到(2,8);

同理,增加行操作,假设当前点是(4,8),假设增加的行有1,4;比4 小的有一个,但是4这一行也是插入到(4,8)的前面,所以总共是两个,更新得到(6,8);

  1 #include<string.h>
2 struct mm
3 {
4 int ex;
5 int dr[30],dc[30],ir[30],ic[30];
6 int jx,jy,jjx,jjy;
7 }p[100];
8 int step(int f,mm w,int &px,int &py)
9 {
10 int i;
11 if(f==0)
12 {
13 int y=0;
14 for(i=1;i<=w.dr[0];i++)
15 {
16 if(w.dr[i]<px)
17 y++; // 统计比当前小的行数的数量
18 else if(w.dr[i]==px)
19 return 0;
20 }
21 px-=y; // 更新当前的位置
22 }
23 else if(f==1)
24 {
25 int y=0;
26 for(i=1;i<=w.dc[0];i++)
27 {
28 if(w.dc[i]<py)
29 y++; // 统计比当前小的列数的数量
30 else if(w.dc[i]==py)
31 return 0;
32 }
33 py-=y;
34 }
35 else if(f==2)
36 {
37 int y=0;
38 for(i=1;i<=w.ir[0];i++)
39 {
40 if(w.ir[i]<=px)
41 y++; //统计比当前小的行数 ,记得用小于等于
42 }
43 px+=y;
44 }
45 else if(f==3)
46 {
47 int y=0;
48 for(i=1;i<=w.ic[0];i++)
49 {
50 if(w.ic[i]<=py)
51 y++;
52 }
53 py+=y;
54 }
55 else if(f==4)
56 {
57 if(w.jx==px&&w.jy==py)
58 {
59 px=w.jjx;
60 py=w.jjy;
61 }
62 else if(w.jjx==px&&w.jjy==py)
63 {
64 px=w.jx;
65 py=w.jy;
66 }
67 }
68 return 1;
69 }
70 int main()
71 {
72 int m,n,i,j,l=0;
73 while(scanf("%d%d",&m,&n),m||n)
74 {
75 int t,x;
76 scanf("%d",&t);
77 for(i=0;i<t;i++)
78 {
79 char ch[10];
80 scanf("%s",ch);
81 if(strcmp(ch,"DR")==0) //记录删除的行
82 {
83 scanf("%d",&p[i].dr[0]);
84 p[i].ex=0;
85 for(j=1;j<=p[i].dr[0];j++)
86 scanf("%d",&p[i].dr[j]);
87 }
88 else if(strcmp(ch,"DC")==0) //记录删除的列
89 {
90 scanf("%d",&p[i].dc[0]);
91 p[i].ex=1;
92 for(j=1;j<=p[i].dc[0];j++)
93 scanf("%d",&p[i].dc[j]);
94 }
95 else if(strcmp(ch,"IR")==0) //记录增加的行
96 {
97 scanf("%d",&p[i].ir[0]);
98 p[i].ex=2;
99 for(j=1;j<=p[i].ir[0];j++)
100 scanf("%d",&p[i].ir[j]);
101 }
102 else if(strcmp(ch,"IC")==0) //记录增加的列
103 {
104 scanf("%d",&p[i].ic[0]);
105 p[i].ex=3;
106 for(j=1;j<=p[i].ic[0];j++)
107 scanf("%d",&p[i].ic[j]);
108 }
109 else if(strcmp(ch,"EX")==0) //记录交换的点
110 {
111 scanf("%d%d%d%d",&p[i].jx,&p[i].jy,&p[i].jjx,&p[i].jjy);
112 p[i].ex=4;
113 }
114 }
115 if(l)
116 puts("");
117 scanf("%d",&x);
118 printf("Spreadsheet #%d\n",++l);
119 for(i=0;i<x;i++)
120 {
121 int xx,yy,x1,y1,g=1;
122 scanf("%d%d",&xx,&yy);
123 x1=xx,y1=yy; //将当前的点保存下来
124 for(j=0;j<t;j++)
125 {
126 g=step(p[j].ex,p[j],xx,yy);
127 //printf("%d -- %d\n",xx,yy);// 如果g=0,这个点被删除,直接跳出循环
128 if(!g)break;
129 }
130 if(g)
131 printf("Cell data in (%d,%d) moved to (%d,%d)\n",x1,y1,xx,yy);
132 else
133 printf("Cell data in (%d,%d) GONE\n",x1,y1);
134 }
135
136 }
137 }