题意 :
有一个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 ",++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 ",xx,yy);// 如果g=0,这个点被删除,直接跳出循环 128 if(!g)break; 129 } 130 if(g) 131 printf("Cell data in (%d,%d) moved to (%d,%d) ",x1,y1,xx,yy); 132 else 133 printf("Cell data in (%d,%d) GONE ",x1,y1); 134 } 135 136 } 137 }