欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVa 512 Spreadsheet Tracking

程序员文章站 2024-03-19 08:25:16
...

题意

有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1~r,列从左到右编号为1 ~c。你的任务是模拟n个操作。具体来说一共有5种操作:
EX r1 c1 r2 c2交换单元格(r1,c1),(r2,c2)。
DR/DC/IR/IC A x1 x2 … xA 插入或删除A行或列(DC-删除列,DR-删除行,IC-插入 列,IR-插入行,1≤A≤10)。
在插入/删除指令后,各个x值不同,且顺序任意。接下来是q个查询,每个查询格式 为“r c”,表示查询原始表格的单元格(r,c)。对于每个查询,输出操作执行完后该单元格的新 位置。输入保证在任意时刻行列数均不超过50

思路

共有两种思路。一种是先模拟操作,每次查询立刻返回结果。另一种是先记录下操作,查询时进行一边操作,返回结果。相比较而言,后者更加好写,效率更高。下面代码为第二种思路。

代码

//#define LOCAL
#include <bits/stdc++.h>
using namespace std;
#define DBG printf("Everything is OK!\n")
#define mem(t, v) memset ((t) , v, sizeof(t))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define eps 1e-6
#define ll long long

const ll mod = 1e9 + 7;

struct Cmd {

    string s;
    int k[15];
}cmd[100];

int R, C, oper, query, rt, ct, fx, fy;

void cmmd(int x, int y) {

    for(int i = 1; i <= oper; i++) {
        int cnt = 0;
        if(cmd[i].s == "DR") {
            for(int j = 1; j <= cmd[i].k[0]; j++) {
                if(cmd[i].k[j] < x)
                    cnt++;
                else if(cmd[i].k[j] == x) {
                    printf("GONE\n");
                    return;
                }
            }
            x -= cnt;
        }
        else if(cmd[i].s == "DC") {
            for(int j = 1; j <= cmd[i].k[0]; j++) {
                if(cmd[i].k[j] < y)
                    cnt++;
                else if(cmd[i].k[j] == y) {
                    printf("GONE\n");
                    return;
                }
            }
            y -= cnt;
        }
        else if(cmd[i].s == "IR") {
            for(int j = 1; j <= cmd[i].k[0]; j++) {
                if(cmd[i].k[j] <= x)
                    cnt++;
            }
            x += cnt;
        }
        else if(cmd[i].s == "IC") {
            for(int j = 1; j <= cmd[i].k[0]; j++) {
                if(cmd[i].k[j] <= y)
                    cnt++;
            }
            y += cnt;
        }
        else {
            if(cmd[i].k[1] == x && cmd[i].k[2] == y) {
                x = cmd[i].k[3];
                y = cmd[i].k[4];
            }
            else if(cmd[i].k[3] == x && cmd[i].k[4] == y) {
                x = cmd[i].k[1];
                y = cmd[i].k[2];
            }
        }
    }
    printf("moved to (%d,%d)\n", x, y);
    return ;
}

int main(void) {

#ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("wdata.out", "w", stdout);
#endif
    int num = 0;
    while(scanf("%d %d", &R, &C) == 2 && R != 0) {
        scanf("%d", &oper);
        for(int i = 1; i <= oper; i++) {
            cin >> cmd[i].s;
            if(cmd[i].s != "EX") {
                scanf("%d", &cmd[i].k[0]);
                for(int j = 1; j <= cmd[i].k[0]; j++)
                    scanf("%d", &cmd[i].k[j]);
            }
            else {
                for(int j = 1; j <= 4; j++)
                    scanf("%d", &cmd[i].k[j]);
            }
        }
        scanf("%d", &query);
        if(num > 0)
            printf("\n");
        printf("Spreadsheet #%d\n", ++num);
        while(query--) {
            scanf("%d %d", &rt, &ct);
            printf("Cell data in (%d,%d) ", rt, ct);
            cmmd(rt, ct);
        }
    }
    return 0;
}