UVA512B

Posted torettorui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("
");
    for(int i=0;i<num_comd;i++)
    {
        printf("%c  ",Vector[i]->comd[1]);
    }
    printf("
");
}

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
",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
",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
",q_row,q_col);
                        return;
                    }
                }
                ans_row=ans_row-d_r;
//printf("ans_row=%d,ans_col=%d
",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
",q_row,q_col);
                        return;
                    }
                }
                ans_col=ans_col-d_c;
//printf("ans_row=%d,ans_col=%d
",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
",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
",ans_row,ans_col);
            }
        }
    }
    printf("Cell data in (%d,%d) moved to (%d,%d)
",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("
");
        }
        printf("Spreadsheet #%d
",++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的主要内容,如果未能解决你的问题,请参考以下文章

UVa 1442 - Cave

NO.25磁盘分区及格式化扩展Swap空间文件系统管理

計算機的啟動

UVa10410代码

UVa 1593代码对齐

UVa 1593 代码对齐