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
- e
- E
- E
- e
- e
- e
- e
- e
- E
- e
- E
- e
- e
- E
- e
- e
- e
- E
- SGU 4554 Boring Game 来自队友的神奇随机Hash
- schema_reference: 由于 accessExternalSchema 属性设置的限制而不允许 'file' 访问, 因此无法读取方案文档 '***.xsd'。
- C++ SendMessage()乱码问题解决
- Android调Ajax和动态添加JS中的token(Android 和JS完全交互)
- 数据库优化 SQL语句优化
- E
- Qt arm开发板远程调试
- 《大话数据结构》笔记(1)--数据结构绪论,算法
- Poj
- lintcode(95)验证二叉查找树
- mutex简介
- CI框架出现 No input file specified.
- python:【转载】python+Eclipse+pydev环境搭建
- WordPress提示500 Internal Server Error