例题4-5 uva 512 - Spreadsheet Tracking

本题主要就在于模拟删除和插入等操作,还有一点就是将位置信息通过数字的方式存储在对应的数组元素之中,巧妙地利用数组下标,简单的实现了原位置与当前位置的对应关系。
#include<stdio.h>
#include<string.h>
#define Max 10000
int d[60][60],a[100],ans[60][60],d1[60][60];
char s[5];
int r1,c1,r,c;
void copy(char type,int p,int q)
{
	int i;
	if(type=='R')
	{
		for(i=1;i<=c;i++)
		d[p][i]=d1[q][i];
	}
	else
	for(i=1;i<=r;i++)
	d[i][p]=d1[i][q];
}
void ins(char type)
{
	int cnt=(type=='R')?r:c,cnt2=0;
	int i;
	memcpy(d1,d,sizeof(d));
	for(i=1;i<=cnt;i++)
	{
		if(a[i]) copy(type,++cnt2,0);
		copy(type,++cnt2,i);
	}
	if(type=='R') r=cnt2;
	else c=cnt2;
}
void del(char type)
{
	int cnt=(type=='R')?r:c,cnt2=0;
	int i;
	memcpy(d1,d,sizeof(d));
	for(i=1;i<=cnt;i++)
		if(!a[i]) copy(type,++cnt2,i);
	if(type=='R') r=cnt2;
	else c=cnt2; 
}
int main ()
{
	int n,count=0;
	while(scanf("%d%d",&r,&c)==2)
	{
		memset(d,0,sizeof(d));
		if(r==0 && c==0) break;
		scanf("%d",&n);
		int i,j,t;
		for(i=1;i<=r;i++)
			for(j=1;j<=c;j++)
			{
				d[i][j]=i*Max+j;  //将原位置信息存到对应的数组元素中 
			}
		while(n--)
		{
			scanf("%s",s);
			if(s[0]=='E')
			{	
				int r2,c2,t;
				scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
				t=d[r1][c1];
				d[r1][c1]=d[r2][c2];
				d[r2][c2]=t;
			}
			else 
			{
				int m,i;
				scanf("%d",&m);
				memset(a,0,sizeof(a));
				for(i=0;i<m;i++)
				{
					int x;
					scanf("%d",&x);
					a[x]=1;
				}
				if(s[0]=='D') del(s[1]);
				else ins(s[1]);
			}
		}
		memset(ans,0,sizeof(ans));
		for(i=1;i<=r;i++)
			for(j=1;j<=c;j++)
				ans[d[i][j]/Max][d[i][j]%Max]=i*Max+j;   //将当前的位置信息存入数组中 ,该数组下标表示的就是原来的位置 
		if(count>0) printf("\n");
		printf("Spreadsheet #%d\n",++count);
		scanf("%d",&t);
		while (t--)
		{
			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]/Max,ans[r1][c1]%Max);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值