码迷,mamicode.com
首页 > 其他好文 > 详细

UVA512B

时间:2019-02-19 01:00:33      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:int   数组   span   def   %s   imu   put   delete   ==   

这种方式和之前的思路不一样,主要是先保存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为好。

UVA512B

标签:int   数组   span   def   %s   imu   put   delete   ==   

原文地址:https://www.cnblogs.com/TorettoRui/p/10398464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!