UVA-512-Spreadsheet Tracking 简单模拟题 对一个表进行增删操作后查表 打表写法+详细注释
来源:互联网 发布:让 皮埃尔.热内 知乎 编辑:程序博客网 时间:2024/05/29 10:53
题目我就不贴了(懒)。
题意:
有一个r行c列的电子表格,对其进行n个操作。操作类型分为5种:
1. 删除行 2. 删除列 3. 插入行 4. 插入列 5. 交换两个元素位置
输入查找点(没操作前的位置),输出经过n个操作后对应的位置
思路:
1. 我是先打了个表
2. 然后我再对表执行n个操作
3. 最后我再进行搜表输出
4. 另一种思路(网上的大部分思路)是把n个操作都存起来,然后对查询点进行变动然后输出,这个思路的代码量比我的短很多,我的思路写了4000,150行。存操作的思路一般是1000+ ,不知道多少行。新手和老手的差距就在思路上体现出来了。
注意:
1. 不同的测试样例之间用空行隔开(即第一个样例不输出空行,其他样例都先输出一个空行)。
2. 测试样例要先在第一行输出是第几组,即Spreadsheet #num。
3. 题目要求多组数据输入,遇到r=c=0时结束程序
4. wa了很多次在格式上,烦!
5. 剩余的我在注释里都写得很详细了,不明白可以问,谢谢。
我的AC代码如下:
#include <iostream>#include <algorithm>#include <cstdio>using namespace std;int a[55][55],b[10000];//打表,因为我的思想是最后搜表输出void init(){ for(int i=1;i<=50;i++) for(int j=1;j<=50;j++) a[i][j]=(i-1)*50+j;}int main(){ //freopen("input.txt","r",stdin); int r,c,n,m,kase=0,temp=0; char ch1,ch2; while(cin >> r >> c) { if(r==0 && c==0) break; //用temp控制测试样例间的空行,即第二个开始输出空行 if(temp) cout << endl; temp++; //用kase控制第几个样例 kase++; cout << "Spreadsheet #" << kase << endl; //打表 init(); //输入n个操作,并执行 cin >> n; for(int i=0;i<n;i++) { //读入处理类型 cin >> ch1 >> ch2; //删除行 if(ch1=='D' && ch2=='R') { cin >> m; for(int j=0;j<m;j++) cin >> b[j]; sort(b,b+m); //删除行的实际操作 for(int j=0;j<m;j++) { for(int u=b[j];u<r;u++) for(int v=1;v<=c;v++) a[u][v]=a[u+1][v]; //更新剩余操作修改行下标 for(int v=j+1;v<m;v++) b[v]--; r--; } } //删除列 else if(ch1=='D' && ch2=='C') { cin >> m; for(int j=0;j<m;j++) cin >> b[j]; sort(b,b+m); //删除列的实际操作 for(int j=0;j<m;j++) { for(int u=b[j];u<c;u++) for(int v=1;v<=r;v++) a[v][u]=a[v][u+1]; //更新剩余操作修改列下标 for(int v=j+1;v<m;v++) b[v]--; c--; } } //增加列 else if(ch1=='I' && ch2=='C') { cin >> m; for(int j=0;j<m;j++) cin >> b[j]; sort(b,b+m); //增加列的实际操作 for(int j=0;j<m;j++) { c++; for(int u=c;u>b[j];u--) for(int v=1;v<=r;v++) a[v][u]=a[v][u-1]; for(int v=1;v<=r;v++) a[v][b[j]]=0; //更新剩余操作修改列下标 for(int v=j+1;v<m;v++) b[v]++; } } //增加行 else if(ch1=='I' && ch2=='R') { cin >> m; for(int j=0;j<m;j++) cin >> b[j]; sort(b,b+m); //增加行的实际操作 for(int j=0;j<m;j++) { r++; for(int u=r;u>b[j];u--) for(int v=1;v<=c;v++) a[u][v]=a[u-1][v]; for(int v=1;v<=c;v++) a[b[j]][v]=0; //更新剩余操作修改行下标 for(int v=j+1;v<m;v++) b[v]++; } } //交换表中的两个变量(五个处理中最简单的一个) else if(ch1=='E' && ch2=='X') { int x1,y1,x2,y2,t; cin >> x1 >> y1 >> x2 >> y2; t=a[x1][y1]; a[x1][y1]=a[x2][y2]; a[x2][y2]=t; } } int sum,tx,ty,flag; //输入查询数,并搜表输出,搜不到就输出GONE cin >> sum; for(int u=0;u<sum;u++) { //输入查询点 cin >> tx >> ty; //记得每次搜都要把flag这个判断变量清零 flag=0; for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { if(a[i][j]==(tx-1)*50+ty) { cout << "Cell data in (" << tx <<','<<ty<<") moved to (" << i << ',' << j << ")" << endl; //用flag判断搜索终点 flag=1; break; } } //用flag判断搜索终点 if(flag==1) break; } //如果搜不到就输出GONE if(flag==0) cout << "Cell data in (" << tx <<','<<ty<<") GONE" << endl; } } return 0;}
0 0
- UVA-512-Spreadsheet Tracking 简单模拟题 对一个表进行增删操作后查表 打表写法+详细注释
- UVa 512 - Spreadsheet Tracking (模拟)
- UVA - 512 Spreadsheet Tracking
- Uva - 512 - Spreadsheet Tracking
- UVA - 512 Spreadsheet Tracking
- UVA-512 Spreadsheet Tracking
- UVa 512 Spreadsheet Tracking
- uva 512 Spreadsheet Tracking
- UVa 512 Spreadsheet Tracking
- UVa 512 Spreadsheet Tracking
- UVa 512 - Spreadsheet Tracking
- UVa 512 Spreadsheet Tracking
- 【水题】UVA 512 Spreadsheet Tracking
- 例题4-5 uva 512 - Spreadsheet Tracking
- 紫书章四 Spreadsheet Tracking UVA
- UVA 512 - Spreadsheet Tracking 模拟 WA了一天,莫名其妙的A了
- [UVA512]Spreadsheet Tracking[模拟][STL]
- 512 - Spreadsheet Tracking
- 字符数组与字符串
- swift——复合类型——Set
- 纠错《COM技术内幕》之ProgID
- yii2 中的request 请求的方法详解
- Docker中如何删除image(镜像)
- UVA-512-Spreadsheet Tracking 简单模拟题 对一个表进行增删操作后查表 打表写法+详细注释
- swift——复合类型——Dict
- js中的this
- 学习笔记—C语言基础篇03
- RxJava&Retrofit
- File google-services.json is missing. The Google Services
- C语言计算字符串长度的几种方法
- JStorm学习笔记-集群环境安装部署
- uwsgi的定时脚本任务