UVA512B

这种方式和之前的思路不一样,主要是先保存comd,然后再一个一个模拟。

下面贴出我写出的代码

//其实这种方式不一定比那种方式效率高
//这种方式适合于表格比较多,但是查询的cell比较少的情况
//那种情况适合于查询的cell比较多的情况
#include<cstdio>
#include<vector>
using namespace std;
struct Command
{
    char comd[3];
    int r1,c1,r2,c2;
    int num;
    int r_c[15];
};


vector<Command*>Vector;

int row_original,col_original,row_now,col_now,num_comd,num_query,q_row,q_col,ans_row,ans_col,kase=0;//没有必要保存各个需要查询的query,可以边遍历边查询

void print_Command()
{
    printf("\n");
    for(int i=0;i<num_comd;i++)
    {
        printf("%c  ",Vector[i]->comd[1]);
    }
    printf("\n");
}

void clear_Vec()
{
    for(int i=0;i<num_comd;i++)
    {
        delete Vector[i];
    }
    Vector.clear();
}

bool read_comd()
{
    clear_Vec();
    if(scanf("%d%d%d",&row_original,&col_original,&num_comd)==3&&row_original)
    {
//printf("%d%d%d\n",row_original,col_original,num_comd);
        for(int i=0;i<num_comd;i++)
        {
            Command *u=new Command;
            scanf("%s",u->comd);
//printf("%s",u->comd);
            if(u->comd[0]=='E')
            {
                scanf("%d%d%d%d",&u->r1,&u->c1,&u->r2,&u->c2);
                Vector.push_back(u);
            }
            else
            {
                scanf("%d",&u->num);
                for(int i=0;i<u->num;i++)
                {
                    scanf("%d",&u->r_c[i]);
                }
                Vector.push_back(u);
            }
        }
        return true;
    }
    else
        return false;
}

void simulate()
{
    ans_row=q_row;
    ans_col=q_col;
    for(int i=0;i<num_comd;i++)
    {
        if(Vector[i]->comd[0]=='E')
        {
            if(Vector[i]->r1==ans_row&&Vector[i]->c1==ans_col)
            {
                ans_row=Vector[i]->r2;
                ans_col=Vector[i]->c2;
            }
            else if(Vector[i]->r2==ans_row&&Vector[i]->c2==ans_col)
            {
                ans_row=Vector[i]->r1;
                ans_col=Vector[i]->c1;
            }
//printf("ans_row=%d,ans_col=%d\n",ans_row,ans_col);
        }

        if(Vector[i]->comd[0]=='D')
        {
            if(Vector[i]->comd[1]=='R')
            {
                int d_r=0;
                for(int j=0;j<Vector[i]->num;j++)
                {
                    if(Vector[i]->r_c[j]<ans_row)
                    {
                        d_r++;
                    }
                    if(Vector[i]->r_c[j]==ans_row)
                    {
                        printf("Cell data in (%d,%d) GONE\n",q_row,q_col);
                        return;
                    }
                }
                ans_row=ans_row-d_r;
//printf("ans_row=%d,ans_col=%d\n",ans_row,ans_col);
            }
            if(Vector[i]->comd[1]=='C')
            {
                int d_c=0;
                for(int j=0;j<Vector[i]->num;j++)
                {
                    if(Vector[i]->r_c[j]<ans_col)
                    {
                        d_c++;
                    }
                    if(Vector[i]->r_c[j]==ans_col)
                    {
                        printf("Cell data in (%d,%d) GONE\n",q_row,q_col);
                        return;
                    }
                }
                ans_col=ans_col-d_c;
//printf("ans_row=%d,ans_col=%d\n",ans_row,ans_col);
            }
        }
        if(Vector[i]->comd[0]=='I')
        {
            if(Vector[i]->comd[1]=='R')
            {
                int d_r=0;
                for(int j=0;j<Vector[i]->num;j++)
                {
                    if(Vector[i]->r_c[j]<=ans_row)
                    {
                        d_r++;
                    }
                }
                ans_row=ans_row+d_r;
//printf("ans_row=%d,ans_col=%d\n",ans_row,ans_col);
            }
            if(Vector[i]->comd[1]=='C')
            {
                int d_c=0;
                for(int j=0;j<Vector[i]->num;j++)
                {
                    if(Vector[i]->r_c[j]<=ans_col)
                    {
                        d_c++;
                    }
                }
                ans_col=ans_col+d_c;
//printf("ans_row=%d,ans_col=%d\n",ans_row,ans_col);
            }
        }
    }
    printf("Cell data in (%d,%d) moved to (%d,%d)\n",q_row,q_col,ans_row,ans_col);
    return;
}

int main()
{
#ifdef local
    freopen("input.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    while(read_comd())
    {
//print_Command();
        if(kase)
        {
            printf("\n");
        }
        printf("Spreadsheet #%d\n",++kase);
        scanf("%d",&num_query);
        for(int i=0;i<num_query;i++)
        {
            scanf("%d%d",&q_row,&q_col);
            simulate();
        }

    }
    return 0;
}

在这道题中,如代码的注释部分,适用于cell比较少的情况,要不然cell比较多的话,一个一个进行模拟,非常的浪费时间。

学到的一点就是,Vector中如果要保存结构体,那么必须写成vector<*struct>,将vector初始化的时候,不能直接vector.clear(),而要先回收各个内存,然后再clear();

还想说一点就是,调试的时候,可以直接在判断代码出断电调试,会比较的快,虽然之前我一直在用。

汝佳大神的代码使用的不是Vector,而是数组,我觉得这种没有明确告诉数量上限的还是使用vector为好。

转载于:https://www.cnblogs.com/TorettoRui/p/10398464.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值