zoukankan      html  css  js  c++  java
  • 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 cell operations include inserting and deleting rows or columns and exchanging cell contents.


    Some spreadsheets allow users to mark collections of rows or columns for deletion, so the entire collection can be deleted at once. Some (unusual) spreadsheets allow users to mark collections of rows or columns for insertions too. Issuing an insertion command results in new rows or columns being inserted before each of the marked rows or columns. Suppose, for example, the user marks rows 1 and 5 of the spreadsheet on the left for deletion. The spreadsheet then shrinks to the one on the right.

    $	extstyle parbox{.5	extwidth}{
egin{center}
egin{tabular}{rvert rvert ...
...4 & 35 & 36 & 22 & 38 & 39 & 40 & 41
\ cline{2-10}
end{tabular}end{center}}$ $	extstyle parbox{.49	extwidth}{
egin{center}
egin{tabular}{rvert rvert...
...4 & 35 & 36 & 22 & 38 & 39 & 40 & 41
\ cline{2-10}
end{tabular}end{center}}$

    If the user subsequently marks columns 3, 6, 7, and 9 for deletion, the spreadsheet shrinks to this.

    $searrow$ 1 2 3 4 5
    1 2 24 8 22 16
    2 18 19 21 22 25
    3 24 25 67 22 71
    4 16 12 10 22 58
    5 33 34 36 22 40

    If the user marks rows 2, 3 and 5 for insertion, the spreadsheet grows to the one on the left. If the user then marks column 3 for insertion, the spreadsheet grows to the one in the middle. Finally, if the user exchanges the contents of cell (1,2) and cell (6,5), the spreadsheet looks like the one on the right.

    $	extstyle parbox{.33	extwidth}{
egin{center}
egin{tabular}{rvert rvert...
...cline{2-6}
8 & 33 & 34 & 36 & 22 & 40
\ cline{2-6}
end{tabular}end{center}}$ $	extstyle parbox{.33	extwidth}{
egin{center}
egin{tabular}{rvert rvert...
...ine{2-7}
8 & 33 & 34 & & 36 & 22 & 40
\ cline{2-7}
end{tabular}end{center}}$ $	extstyle parbox{.32	extwidth}{
egin{center}
egin{tabular}{rvert rvert...
...ine{2-7}
8 & 33 & 34 & & 36 & 22 & 40
\ cline{2-7}
end{tabular}end{center}}$

    You must write tracking software that determines the final location of data in spreadsheets that result from row, column, and exchange operations similar to the ones illustrated here.

    Input 

    The input consists of a sequence of spreadsheets, operations on those spreadsheets, and queries about them. Each spreadsheet definition begins with a pair of integers specifying its initial number of rows ( r) and columns ( c), followed by an integer specifying the number ( n) of spreadsheet operations. Row and column labeling begins with 1. The maximum number of rows or columns of each spreadsheet is limited to 50. The following n lines specify the desired operations.


    An operation to exchange the contents of cell (r1, c1) with the contents of cell (r2, c2) is given by:


    EXr1c1r2c2


    The four insert and delete commands--DC (delete columns), DR (delete rows), IC (insert columns), and IR (insert rows) are given by:


    <command> Ax1x2$dots$xA


    where <command> is one of the four commands; A is a positive integer less than 10, and $x_1, dots, x_A$ are the labels of the columns or rows to be deleted or inserted before. For each insert and delete command, the order of the rows or columns in the command has no significance. Within a single delete or insert command, labels will be unique.


    The operations are followed by an integer which is the number of queries for the spreadsheet. Each query consists of positive integers r and c, representing the row and column number of a cell in the original spreadsheet. For each query, your program must determine the current location of the data that was originally in cell (r, c). The end of input is indicated by a row consisting of a pair of zeros for the spreadsheet dimensions.

    Output 

    For each spreadsheet, your program must output its sequence number (starting at 1). For each query, your program must output the original cell location followed by the final location of the data or the word GONE if the contents of the original cell location were destroyed as a result of the operations. Separate output from different spreadsheets with a blank line.


    The data file will not contain a sequence of commands that will cause the spreadsheet to exceed the maximum size.

    Sample Input 

    7 9
    5
    DR   2  1 5
    DC  4  3 6 7 9
    IC  1  3
    IR  2  2 4
    EX 1 2 6 5
    4
    4 8
    5 5
    7 8
    6 5
    0 0
    

    Sample Output 

    Spreadsheet #1
    Cell data in (4,8) moved to (4,6)
    Cell data in (5,5) GONE
    Cell data in (7,8) moved to (7,6)
    Cell data in (6,5) moved to (1,2)

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <algorithm>
      5 #include <cmath>
      6 #include <map>
      7 #include <set>
      8 #include <stack>
      9 #include <queue>
     10 #include <string>
     11 #include <vector>
     12 using namespace std;
     13 const double EXP=1e-8;
     14 const double PI=acos(-1.0);
     15 const int INF=0x7fffffff;
     16 const int MS=55;
     17 const int MAX=10005;
     18 
     19 struct command
     20 {
     21     char c[5];
     22     int r1,c1,r2,c2;
     23     int n;
     24     int x[MS];
     25 }cmd[MAX];
     26 int R,C,N,Q;
     27 int find(int &r0,int &c0)
     28 {
     29     for(int i=0;i<N;i++)
     30     {
     31         if(cmd[i].c[0]=='E')
     32         {
     33             if(cmd[i].r1==r0&&cmd[i].c1==c0)
     34             {
     35                 r0=cmd[i].r2;
     36                 c0=cmd[i].c2;
     37             }
     38             else if(cmd[i].r2==r0&&cmd[i].c2==c0)
     39             {
     40                 r0=cmd[i].r1;
     41                 c0=cmd[i].c1;
     42             }
     43         }
     44         else
     45         {
     46             int dr=0,dc=0;
     47             for(int j=0;j<cmd[i].n;j++)
     48             {
     49                 int x=cmd[i].x[j];
     50                 if(cmd[i].c[0]=='I')
     51                 {
     52                     if(cmd[i].c[1]=='R'&&x<=r0)
     53                         dr++;
     54                     if(cmd[i].c[1]=='C'&&x<=c0)
     55                         dc++;
     56                 }
     57                 else
     58                 {
     59                     if(cmd[i].c[1]=='R'&&x==r0)
     60                         return 0;
     61                     if(cmd[i].c[1]=='C'&&x==c0)
     62                         return 0;
     63                     if(cmd[i].c[1]=='R'&&x<r0)
     64                         dr--;
     65                     if(cmd[i].c[1]=='C'&&x<c0)
     66                         dc--;
     67                 }
     68             }
     69             r0+=dr;
     70             c0+=dc;
     71         }
     72     }
     73     return 1;
     74 }
     75 int main()
     76 {
     77     int r0,c0,kase=0;
     78     while(scanf("%d%d%d",&R,&C,&N)==3&&R)
     79     {
     80         for(int i=0;i<N;i++)
     81         {
     82             scanf("%s",cmd[i].c);
     83             if(cmd[i].c[0]=='E')
     84                 scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);
     85             else
     86             {
     87                 scanf("%d",&cmd[i].n);
     88                 for(int j=0;j<cmd[i].n;j++)
     89                     scanf("%d",&cmd[i].x[j]);
     90             }
     91         }
     92         if(kase>0)
     93             printf("
    ");
     94         printf("Spreadsheet #%d
    ",++kase);
     95         scanf("%d",&Q);
     96         while(Q--)
     97         {
     98             scanf("%d%d",&r0,&c0);
     99             printf("Cell data in (%d,%d) ",r0,c0);
    100             if(!find(r0,c0))
    101                 printf("GONE
    ");
    102             else
    103                 printf("moved to (%d,%d)
    ",r0,c0);
    104         }
    105     }
    106     return 0;
    107 }
  • 相关阅读:
    《区块链100问》第33集:在交易平台投资区块链资产
    Python学习(三)数组属性方法总结
    Python学习(二)Numpy学习
    数学之美 第2章 自然语言处理:从规则到统计
    数学之美 第1章 文字和语言 vs 数字和信息
    Python学习(一)基础知识
    Python使用技巧(不定期更新)
    玩转Git三剑客——04. 创建第一个仓库并配置local用户信息、05. 通过几次commit来认识工作区和暂存区
    玩转Git三剑客——02. 安装Git、03. 使用Git之前需要做的最小配置
    玩转Git三剑客——01. 课程综述
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4244523.html
Copyright © 2011-2022 走看看