UVALive5198 UVA512 Spreadsheet Tracking

World Finals >> 1997 - San Jose

问题链接UVALive5198 UVA512 Spreadsheet Tracking

问题简述:这是一个电子表格操作的模拟题。先输入电子表格总的行和列的正整数r和c,满足r,c<=50,r和c均为0时,输入测试实例结束;然后输入命令数n,跟着是n条命令,包括:

1. EX r1 c1 r2 c2,其含义是两个单元交换,即<r1,c1>和<r2,c2>内容交换;

2. 插入和删除命令,共4条,分别是DC(删除列)、DR(删除行)、IC(插入列)和IR(插入行),其格式如下:

< command > A x1 x2 . . . xA

其中,A为正整数,值小于10,指定其后列表xi的元素个数;列表x为删除或插入的行或列(是行还是列由命令决定)。

然后输入一个单元数,其后跟着若干个单元(r,c),r和c分别是单元的行和列坐标。对于每一个单元坐标,计算输出执行上面的命令序列之后,左边变为多少?

问题分析:采用先读入命令序列,再进行重复模拟的工作方式,相对而言比较易于理解和实现。

程序说明:结构数组cmd[]用于存储电子表格命令,枚举语句(enum operation {EX, DC, DR, IC, IR};)用于将命令转换为整数形式,函数simulate()用于模拟命令的执行。

AC的C语言程序如下:

/* UVALive5198 UVA512 Spreadsheet Tracking */

#include <stdio.h>
#include <stdlib.h>

#define MAXN 50
#define MAXN2 10
#define MAXN3 10000

int grid[MAXN+1][MAXN+1];

enum operation {EX, DC, DR, IC, IR};
struct {
    int cmd;
    int a, x[MAXN2+1];
} cmd[MAXN3];
int ccount;

int cmp(const void *a,const void *b)
{
    return *(int*)a - *(int*)b;
}

void getax(int index)
{
    int i;

    scanf("%d", &cmd[index].a);
    for(i=0; i<cmd[index].a; i++)
        scanf("%d", &cmd[index].x[i]);

    qsort(cmd[index].x, cmd[index].a, sizeof(cmd[index].x[0]), cmp);
}

void simulate(int row, int col)
{
    int row1, col1, row2, col2, i, j;

    row1 = row2 = row;
    col1 = col2 = col;

    for(i=0; i<ccount; i++) {
        switch(cmd[i].cmd) {
        case EX:
            if(row2 == cmd[i].x[0] && col2 == cmd[i].x[1]) {
                row1 = row2 = cmd[i].x[2];
                col1 = col2 = cmd[i].x[3];
            } else if(row2 == cmd[i].x[2] && col2 == cmd[i].x[3]) {
                row1 = row2 = cmd[i].x[0];
                col1 = col2 = cmd[i].x[1];
            }
            break;
        case DR:
            for(j=0; j<cmd[i].a; j++) {
                if(cmd[i].x[j] == row1) {
                    printf("Cell data in (%d,%d) GONE\n", row, col);
                    return;
                } else if(cmd[i].x[j] < row1) {
                    row2--;
                } else
                    break;
            }
            row1 = row2;
            break;
        case DC:
            for(j=0; j<cmd[i].a; j++) {
                if(cmd[i].x[j] == col1) {
                    printf("Cell data in (%d,%d) GONE\n", row, col);
                    return;
                } else if(cmd[i].x[j] < col1) {
                    col2--;
                } else
                    break;
            }
            col1 = col2;
            break;
        case IR:
            for(j=0; j<cmd[i].a; j++) {
                if(cmd[i].x[j] <= row1) {
                    row2++;
                } else
                    break;
            }
            row1 = row2;
            break;
        case IC:
            for(j=0; j<cmd[i].a; j++) {
                if(cmd[i].x[j] <= col1) {
                    col2++;
                } else
                    break;
            }
            col1 = col2;
            break;
        }
    }

    printf("Cell data in (%d,%d) moved to (%d,%d)\n", row, col, row2, col2);
}

int main(void)
{
    int caseno, r, c, n, i;
    char command[8];
    int cn, row, col;

    caseno = 0;
    while(scanf("%d%d", &r, &c) != EOF) {
        if(r == 0 && c == 0)
            break;

        /* 读入命令,存储在结构数组cmd[]中 */
        ccount = 0;
        scanf("%d", &n);
        for(i=1; i<=n; i++) {
            scanf("%s", command);

            if(command[0] == 'E') {
                /* 单元内容交换命令 */
                cmd[ccount].cmd = EX;
                scanf("%d%d%d%d", &cmd[ccount].x[0], &cmd[ccount].x[1], &cmd[ccount].x[2], &cmd[ccount].x[3]);
                ccount++;
            } else if(command[0] == 'D') {
                cmd[ccount].cmd = (command[1] == 'C') ? DC : DR;
                getax(ccount);
                ccount++;
            } else if(command[0] == 'I') {
                cmd[ccount].cmd = (command[1] == 'C') ? IC : IR;
                getax(ccount);
                ccount++;
            }
        }

        if(caseno)
            printf("\n");
        printf("Spreadsheet #%d\n", ++caseno);

        /* 读入单元坐标进行模拟 */
        scanf("%d", &cn);
        for(i=1; i<=cn; i++) {
            scanf("%d%d", &row, &col);
            simulate(row, col);
        }
    }

    return 0;
}
时间: 2024-08-10 19:14:48

UVALive5198 UVA512 Spreadsheet Tracking的相关文章

Spreadsheet Tracking

 Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some operations on spreadsheets can be applied to single cells (r,c), while others can be applied to entire rows or columns. Typical cel

算法竞赛入门经典 第四章

[√ ] UVA1339 古老的密码 Ancient Cipher [√ ] UVA489 刽子手的游戏 Hangman Judge [√ ] UVA133 救济金发放 The Dole Queue [√ ] UVA213 信息解码 Message Decoding [√ ] UVA512 追踪电子表格中的单元格 Spreadsheet Tracking [√ ] UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

追踪电子表格中的单元格

  Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some operations on spreadsheets can be applied to single cells (r,c), while others can be applied to entire rows or columns. Typical ce

uva 512 追踪电子表格中的单元格

 Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some operations on spreadsheets can be applied to single cells (r,c), while others can be applied to entire rows or columns. Typical cel

POJ1420 Spreadsheet(拓扑排序)注意的是超内存

Spreadsheet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 617   Accepted: 290 Description In 1979, Dan Bricklin and Bob Frankston wrote VisiCalc, the first spreadsheet application. It became a huge success and, at that time, was the ki

Method Tracking

一.能做什么? 直观的看到某个时间段内哪个方法花了多少时间. 二.工作台介绍 非独占时间: 某函数占用的CPU时间,包含内部调用其它函数的CPU时间. 独占时间: 某函数占用CPU时间,但不含内部调用其它函数所占用的CPU时间. 三.如何操作 点击Start Method Tracking, 一段时间后再点击一次, trace文件被自动打开, 我们如何判断可能有问题的方法? 通过方法的调用次数和独占时间来查看,通常判断方法是: 如果方法调用次数不多,但每次调用却需要花费很长的时间的函数,可能会有

Google Tango Java SDK开发:Motion Tracking 运动追踪

Java API Motion Tracking Tutorial运动追踪教程 This page describes how the Java API handles motion tracking. 该页面描述了如何使用Java API处理运动追踪. Lifecycle 生命周期 The normal motion tracking system lifecycle consists of three states: TangoPoseData.POSE_INITIALIZING, Tang

手势跟踪论文学习:Realtime and Robust Hand Tracking from Depth(三)Cost Function

iker原创.转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/39050619 Realtime and Robust Hand Tracking from Depth中的Cost Function 学习 首先,我们应该知道,输入的数据是什么:3D 点云数据. 3D点云给我的感觉应该是这种 输出的是:拟合好的手模型(48球体模型). 而这里的的3D 点云数据用p表示,每个球体用Sx 表示. Ci 第i个球体的中心:D表示深度图( 区分还

Codeforces Round #401 (Div. 2) C. Alyona and Spreadsheet

题目链接:C. Alyona and Spreadsheet 题意: 给你一个n*m的矩阵,现在有k个询问,每次给你一个l,r,问你在[l,r]这行中能否有一列数十非递减的顺序 题解: 用vector来保存矩阵. 对于每一行n*m dp一下最远能达到的范围,然后询问的时候就判断l,r是否在这个范围内. 1 #include<bits/stdc++.h> 2 #define pb push_back 3 #define rs m+1,r,rt<<1|1 4 #define mst(a