E

来源:互联网 发布:淘宝卖家服务市场分析 编辑:程序博客网 时间:2024/05/09 14:28

题目链接  https://vjudge.net/contest/160443#problem/E

题意 :

有一个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);

#include<stdio.h>#include<string.h>struct mm{int ex;int dr[30],dc[30],ir[30],ic[30];int jx,jy,jjx,jjy;}p[100];int step(int f,mm w,int &px,int &py){int i;if(f==0){int y=0;for(i=1;i<=w.dr[0];i++){if(w.dr[i]<px)y++;             //  统计比当前小的行数的数量else if(w.dr[i]==px)return 0;}px-=y;// 更新当前的位置}else if(f==1){int y=0;for(i=1;i<=w.dc[0];i++){if(w.dc[i]<py)y++;//  统计比当前小的列数的数量else if(w.dc[i]==py)return 0;}py-=y;}else if(f==2){int y=0;for(i=1;i<=w.ir[0];i++){if(w.ir[i]<=px)y++;   //统计比当前小的行数 ,记得用小于等于}px+=y;}else if(f==3){int y=0;for(i=1;i<=w.ic[0];i++){if(w.ic[i]<=py)y++;}py+=y;}else if(f==4){if(w.jx==px&&w.jy==py){px=w.jjx;py=w.jjy;}else if(w.jjx==px&&w.jjy==py){px=w.jx;py=w.jy;}} return 1;} int main(){int m,n,i,j,l=0;while(scanf("%d%d",&m,&n),m||n){int t,x;scanf("%d",&t);for(i=0;i<t;i++){char ch[10];scanf("%s",ch);if(strcmp(ch,"DR")==0)                   //记录删除的行{scanf("%d",&p[i].dr[0]);p[i].ex=0;for(j=1;j<=p[i].dr[0];j++)scanf("%d",&p[i].dr[j]);}else if(strcmp(ch,"DC")==0)              //记录删除的列{scanf("%d",&p[i].dc[0]);p[i].ex=1;for(j=1;j<=p[i].dc[0];j++)scanf("%d",&p[i].dc[j]);}else if(strcmp(ch,"IR")==0)              //记录增加的行{scanf("%d",&p[i].ir[0]);p[i].ex=2;for(j=1;j<=p[i].ir[0];j++)scanf("%d",&p[i].ir[j]);}else if(strcmp(ch,"IC")==0)              //记录增加的列{scanf("%d",&p[i].ic[0]);p[i].ex=3;for(j=1;j<=p[i].ic[0];j++)scanf("%d",&p[i].ic[j]);}else if(strcmp(ch,"EX")==0)            //记录交换的点{scanf("%d%d%d%d",&p[i].jx,&p[i].jy,&p[i].jjx,&p[i].jjy);p[i].ex=4;}}if(l)puts("");scanf("%d",&x);printf("Spreadsheet #%d\n",++l);for(i=0;i<x;i++){int xx,yy,x1,y1,g=1;scanf("%d%d",&xx,&yy);x1=xx,y1=yy;               //将当前的点保存下来for(j=0;j<t;j++){g=step(p[j].ex,p[j],xx,yy);//printf("%d -- %d\n",xx,yy);// 如果g=0,这个点被删除,直接跳出循环if(!g)break;}if(g)printf("Cell data in (%d,%d) moved to (%d,%d)\n",x1,y1,xx,yy);else printf("Cell data in (%d,%d) GONE\n",x1,y1);}}}

0 0
原创粉丝点击