UVa512-Spreadsheet Tracking
思路:
因为要跟踪单元格而且要查询多次如果同时跟踪所有单元格的改变会很麻烦,所以我们只用把所有的操作给保存下来,然后每次跟踪一个单元格,查询一次就按照顺序再操作一次。另外还要注意的是因为删除和插入的顺序是没有影响的所以同一个操作的所有列或行是同时被改变的,所以要先记录再更改。
代码:
#include <bits/stdc++.h>
using namespace std;
int change(string s,int &r,int &c)
{
int n;
stringstream ss(s);
ss>>s;
if(s=="DR")
{
ss>>n;
int ans,t=0;
for(int i=0;i<n;i++)
{
ss>>ans;
if(ans<r) t++;
else if(ans==r) return 1;
}
r-=t;
}
else if(s=="DC")
{
ss>>n;
int ans,t=0;
for(int i=0;i<n;i++)
{
ss>>ans;
if(ans<c) t++;
else if(ans==c) return 1;
}
c-=t;
}
else if(s=="IR")
{
ss>>n;
int ans,t=0;
for(int i=0;i<n;i++)
{
ss>>ans;
if(ans<=r) t++;
}
r+=t;
}
else if(s=="IC")
{
ss>>n;
int ans,t=0;
for(int i=0;i<n;i++)
{
ss>>ans;
if(ans<=c) t++;
}
c+=t;
}
else if(s=="EX")
{
int x,y,x2,y2;
ss>>x>>y>>x2>>y2;
if(r==x&&c==y) r=x2,c=y2;
else if(r==x2&&c==y2) r=x,c=y;
}
return 0;
}
int main()
{
int r,c,n,p=1;
string s;
while(scanf("%d%d",&r,&c),r+c)
{
if(p>1)printf("\n");
printf("Spreadsheet #%d\n",p++);
vector<string>ve;
cin>>n;getchar();
while(n--)
{
getline(cin,s);
ve.push_back(s);
}
cin>>n;
while(n--)
{
int a,b,i;
cin>>a>>b;
printf("Cell data in (%d,%d) ",a,b);
for(i=0;i<ve.size();i++)
{
if(change(ve[i],a,b)) break;
}
if(i!=ve.size()) printf("GONE\n");
else printf("moved to (%d,%d)\n",a,b);
}
}
return 0;
}