uva512


```cpp
include <iostream> 
#include <string.h>
using namespace std;
const int maxn = 10010;
struct Command{
	char c[5];	//命令
	int a, x[20];	//“增删”命令数及参数
	int r1, c1, r2, c2;	//“交换”命令的参数 
}cmd[maxn];
int r, c, n;
int simulate(int &r, int &c){
	for(int i=0; i<n; ++i){	//依次处理每条命令 
		if(cmd[i].c[0] == 'E'){	//处理EX命令 
			if(cmd[i].r1==r && cmd[i].c1==c) {r=cmd[i].r2; c=cmd[i].c2;}	//更新该单元格的位置
			else if(cmd[i].r2==r && cmd[i].c2==c) {r=cmd[i].r1; c=cmd[i].c1;}
		}else{	//处理D OR R命令 
			int dr = 0, dc = 0;
			for(int j=0; j<cmd[i].a; ++j){	//处理每个命令参数 
				int x = cmd[i].x[j];
				if(cmd[i].c[0] == 'I'){	//如果是增命令 
					if(cmd[i].c[1]=='R' && x<=r) dr++;	//如果是增加行命令并且在该行及以前增加新行,更新行增量dr
					if(cmd[i].c[1]=='C' && x<=c) dc++;	//如果是增加列命令并且在该列及以前增加新列,更新列增量dc 
				}else{	//如果是删命令 
					if(cmd[i].c[1]=='R' && x==r || cmd[i].c[1]=='C' && x==c) return 0;	//如果单元格在当前要删除的行或列中,返回0
					if(cmd[i].c[1]=='R' && x<r) dr--;
					if(cmd[i].c[1]=='C' && x<c) dc--;
				}
			}
			r += dr; c += dc;
		} 
	}
	return 1;
}
int main(){
	int r0, c0, q, kase = 0;
	while(scanf("%d%d%d", &r,&c,&n)==3&&r){	//处理case 
		for(int i=0; i<n; ++i){	//处理命令及其参数的输入 
			scanf("%s", &cmd[i].c);
			if(cmd[i].c[0]=='E'){	//读入EX命令 
				scanf("%d%d%d%d", &cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);
			}else{	//读入D or R命令 
				scanf("%d", &cmd[i].a);
				for(int j=0; j<cmd[i].a; ++j) scanf("%d", &cmd[i].x[j]);
			}
		}
		if(kase>0) puts("");
		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)\n", r0,c0);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值