Spreadsheet Tracking

来源:互联网 发布:淘宝购物车导出excel 编辑:程序博客网 时间:2024/05/22 02:06

UVa 512

这道题如果直接操作步骤很麻烦,而且还容易出错,先将所有操作保存,

然后给定一个坐标后就每个操作进行变换,比如:插入行在当前坐标的

下面,那么插入的那行对当前坐标没有影响。

#include <stdio.h>const int maxn = 10005;struct node{    char ch[5];    int r1, c1, r2, c2;    int n, x[25];}cmd[maxn];int r, c, n;int trans ( int & r0, int & c0 )    //采用引用{    for ( int i = 0; i < n; i ++ )    {        if ( cmd[i].ch[0] == 'E' )  //直接交换        {            if ( cmd[i].r1 == r0 && cmd[i].c1 == c0 )                r0 = cmd[i].r2, c0 = cmd[i].c2;            //不要在下面接if,r0 c0已改变            else if ( cmd[i].r2 == r0 && cmd[i].c2 == c0 )                r0 = cmd[i].r1, c0 = cmd[i].c1;        }        else        {            int dx = 0, dy = 0;            for ( int j = 0; j < cmd[i].n; j ++ )            {                int x = cmd[i].x[j];    //行或列                if ( cmd[i].ch[0] == 'I' )                {                    if ( cmd[i].ch[1] == 'R' && x <= r0 )                        dx ++;                    //行插入在x前面x就应该+1                    if ( cmd[i].ch[1] == 'C' && x <= c0 )                        dy ++;                }                else                {                    if ( cmd[i].ch[1] == 'R' && x == r0 )                        return 0;                    //删除了此行就直接返回                    if ( cmd[i].ch[1] == 'C' && x == c0 )                        return 0;                    if ( cmd[i].ch[1] == 'R' && x < r0 )                        dx --;                    //删除在前面就减1                    if ( cmd[i].ch[1] == 'C' && x < c0 )                        dy --;                }            }            r0 = r0+dx, c0 = c0+dy;        }    }    return 1;}int main ( ){    int r0, c0, q, cas = 0;    while ( ~ scanf ( "%d%d", &r, &c ) && r )    {        scanf ( "%d", &n );        for ( int i = 0; i < n; i ++ )  //将操作保存        {            scanf ( "%s", cmd[i].ch );            if ( cmd[i].ch[0] == 'E' )                scanf ( "%d%d%d%d", &cmd[i].r1, &cmd[i].c1, &cmd[i].r2, &cmd[i].c2 );            else            {                scanf ( "%d", &cmd[i].n );                for ( int j = 0; j < cmd[i].n; j ++ )                    scanf ( "%d", &cmd[i].x[j] );            }        }        if ( cas )  //每个操作中有个换行,最后不需要换行            printf ( "\n" );        printf ( "Spreadsheet #%d\n", ++ cas );        scanf ( "%d", &q );        while ( q -- )        {            scanf ( "%d%d", &r0, &c0 );            printf ( "Cell data in (%d,%d) ", r0, c0 );            if ( ! trans ( r0, c0 ) )                printf ( "GONE\n" );            else                printf ( "moved to (%d,%d)\n", r0, c0 );        }    }    return 0;}


0 0