1. 问题
- 不知道怎么存储操作
- 看代码注释,else if等
2. 代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#define LOCAL
#define MAXN 10000
using namespace std;
int r=0,c=0,n=0,num=0;
// 存储操作,将所有操作集成到一个struct中
struct Command
{
char c[5];
int r1,c1,r2,c2;
int a,x[20];
} cmd[MAXN];
int simulate(int *r0,int *c0)
{
for(int i=0; i<n; i++)
{
if(cmd[i].c[0]=='E')
{
if(cmd[i].r1==*r0&&cmd[i].c1==*c0)
{
*r0=cmd[i].r2;
*c0=cmd[i].c2;
}
// 必须用else if 不能用if不然又交换回去
else if(cmd[i].r2==*r0&&cmd[i].c2==*c0)
{
*r0=cmd[i].r1;
*c0=cmd[i].c1;
}
}
else
{
// 在一个操作完成后变动数据,提前变动会出问题
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<=*r0)
dr++;
// *r0=*r0+1;
if(cmd[i].c[1]=='C'&&x<=*c0)
dc++;
// *c0=*c0+1;
}
else
{
if(cmd[i].c[1]=='R'&&x==*r0)
return 0;
if(cmd[i].c[1]=='C'&&x==*c0)
return 0;
if(cmd[i].c[1]=='R'&&x<*r0)
dr--;
// *r0=*r0-1;
if(cmd[i].c[1]=='C'&&x<*c0)
dc--;
// *c0=*c0-1;
}
}
// *r0+=dr;
// *c0+=dc;
}
}
return 1;
}
int main()
{
#ifdef LOCAL
freopen("input","r",stdin);
// freopen("output","w",stdout);
#endif // LOCAL
while(cin>>r>>c>>n&&r)
{
for(int i=0; i<n; i++)
{
cin>>cmd[i].c;
if(cmd[i].c[0]=='E')
{
cin>>cmd[i].r1>>cmd[i].c1>>cmd[i].r2>>cmd[i].c2;
}
else
{
cin>>cmd[i].a;
for(int j=0; j<cmd[i].a; j++)
{
cin>>cmd[i].x[j];
}
}
}
if(num>0)
cout<<endl;
cout<<"Spreadsheet #"<<++num<<endl;
int q=0;
cin>>q;
while(q--)
{
int r0,c0;
cin>>r0>>c0;
cout<<"Cell data in ("<<r0<<","<<c0<<") ";
if(!simulate(&r0,&c0))
cout<<"GONE"<<endl;
else
cout<<"moved to ("<<r0<<","<<c0<<")"<<endl;
}
}
return 0;
}