UVa512-Spreadsheet Tracking

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值