UVa512追踪电子表格中的单元格题解

 题目

有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1~r,列从左到右编号为 1~c。如图(a)所示,如果先删除第1、5行,然后删除第3,6,7,9列,结果如图(b)所示。

接下来在第2、3、5行前各插入一个空行,然后在第3列前插入一个空列, 会得到如图(e)的结果。 你的任务是模拟这样的n个操作。具体来说一共有5种操作:

EX r1 c1 r2 c2交换单元格(r1,c1),(r2,c2)
Ax1x2…xA插入或删除A行或列(DC-删除列,DR-删除行,IC插入列,IR-插入行,1≤A≤10)。
在插入删除指令后,各个x值不同,且顺序任意。接下来是q个查询,每个查询格 为“r c”,表示查询原始表格的单元格(r,c)。对于每个查询,输出操作执行完后该单元格 新位置。输入保证在任意时刻行列数均不超过50。

图表从上到下从左到右分别为图(a)-(e),图可在

追踪电子表格中的单元格 Spreadsheet Tracking - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)中查看

输入输出样例

输入

7 9
5
DR 2 1 5
DC 4 3 6 7 9
IC 1 3
IR 2 2 4
EX 1 2 6 5
4
4 8
5 5
7 8
6 5
0 0

输出

Spreadsheet #1
Cell data in (4,8) moved to (4,6)
Cell data in (5,5) GONE
Cell data in (7,8) moved to (7,6)
Cell data in (6,5) moved to (1,2)

       第一种思路就是首先模拟操作,算出最后的电子表格,然后再每次查询时直接在电子表格中找到所求的单元格。

#include
#include
#define maxd 100
#define BIG 10000
int r,c,n,d[maxd][maxd],d2[maxd][maxd],ans[maxd][maxd],cols[maxd];//分别表示行,列,操作数,原始数据矩阵,临时矩阵
//最终变换矩阵,记录删除插入操作的矩阵 
void copy(char type,int p,int q){
    int i;//p0){
			printf("\n");
		}
		printf("Spreadsheet #%d\n",++kase);
		scanf("%d",&q);//要查询的次数
		while(q--){
			scanf("%d%d",&r1,&c1);//要查询的位置
			printf("Cell data in (%d,%d)",r1,c1);
			if(ans[r1][c1]==0){
				printf("GONE\n");
			} 
			else{
				printf("moved to (%d,%d)\n",ans[r1][c1]/BIG,ans[r1][c1]%BIG);
			}
		} 
	}
	return 0; 
}               

       第二种思路是将所有操作保存,然后对于每一个查询重新执行每个操作,但不需要计算整个电子表格的变化,而只需关注所查询的单元格的位置变化。对于题目给定的规模来说,这个方法不仅更好些,而且效率更高。

#include
#include
#define maxd 10000
struct Command{
	char c[5];
	int r1,r2,c1,c2;
	int a,x[20];
}cmd[maxd];
int r,c,n;
int simulate(int* r0,int* c0){
	int i;
	for(i=0;i0){
			printf("\n");
		}
		printf("Spreadsheet #%d\n",++kase);
		scanf("%d",&q);
		while(q--){
			scanf("%d%d",&r0,&c0);//查询
			printf("Cell data in (%d,%d)",r0,c0);
			if(!simulate(&r0,&c0)){
				printf("GONE\n");
			} 
			else{
				printf("moved to (%d,%d)",r0,c0);
			}
		}
	}
	return 0;
}            

你可能感兴趣的:(算法题目题解,算法,c语言)