• 紫书第四章练习题 UVA512 Spreadsheet Tracking by 15 anruoxin


    题意 :

    有一个r行c列的电子表格,对其进行n个操作。操作类型分为5种:

    1. 删除行 

    2. 删除列 

    3. 插入行 

    4. 插入列 

    5. 交换两个元素位置

    输入初始查找位置,输出经过n个操作后,变更的位置;

    解题:

    将每一个操作用结构体保存下来,然后对每一个点进行这些操作。删除行,可以先记录比当前这个点小的行有多少,最后进行更新(减去这些行的数量)。

    比如,删除行操作,假设当前点是(4,8),假设删除的行有1,2;比4 小的有两个,最后这点更新得到(2,8);

    同理,增加行操作,假设当前点是(4,8),假设增加的行有1,4;比4 小的有一个,但是4这一行也是插入到(4,8)的前面,所以总共是两个,更新得到(6,8);

      1 #include<string.h>
      2 struct mm
      3 {
      4     int ex;
      5     int dr[30],dc[30],ir[30],ic[30];
      6     int jx,jy,jjx,jjy;
      7 }p[100];
      8 int step(int f,mm w,int &px,int &py)
      9 {
     10     int i;
     11     if(f==0)
     12     {
     13         int y=0;
     14         for(i=1;i<=w.dr[0];i++)
     15         {
     16             if(w.dr[i]<px)
     17             y++;             //  统计比当前小的行数的数量
     18             else if(w.dr[i]==px)
     19             return 0;
     20         }
     21         px-=y;                // 更新当前的位置
     22     }
     23     else if(f==1)
     24     {
     25         int y=0;
     26         for(i=1;i<=w.dc[0];i++)
     27         {
     28             if(w.dc[i]<py)
     29             y++;                //  统计比当前小的列数的数量
     30             else if(w.dc[i]==py)
     31             return 0;
     32         }
     33         py-=y;
     34     }
     35     else if(f==2)
     36     {
     37         int y=0;
     38         for(i=1;i<=w.ir[0];i++)
     39         {
     40             if(w.ir[i]<=px)
     41             y++;   //统计比当前小的行数 ,记得用小于等于
     42         }
     43         px+=y;
     44     }
     45     else if(f==3)
     46     {
     47         int y=0;
     48         for(i=1;i<=w.ic[0];i++)
     49         {
     50             if(w.ic[i]<=py)
     51             y++;
     52         }    
     53         py+=y;
     54     }
     55     else if(f==4)
     56     {
     57         if(w.jx==px&&w.jy==py)
     58         {
     59             px=w.jjx;
     60             py=w.jjy;
     61         }
     62         else if(w.jjx==px&&w.jjy==py)
     63         {
     64             px=w.jx;
     65             py=w.jy;
     66         }
     67     } 
     68     return 1;
     69 } 
     70 int main()
     71 {
     72     int m,n,i,j,l=0;
     73     while(scanf("%d%d",&m,&n),m||n)
     74     {
     75         int t,x;
     76         scanf("%d",&t);
     77         for(i=0;i<t;i++)
     78         {
     79             char ch[10];
     80             scanf("%s",ch);
     81             if(strcmp(ch,"DR")==0)                   //记录删除的行
     82             {
     83                 scanf("%d",&p[i].dr[0]);
     84                 p[i].ex=0;
     85                 for(j=1;j<=p[i].dr[0];j++)
     86                 scanf("%d",&p[i].dr[j]);
     87             }
     88             else if(strcmp(ch,"DC")==0)              //记录删除的列
     89             {
     90                 scanf("%d",&p[i].dc[0]);
     91                 p[i].ex=1;
     92                 for(j=1;j<=p[i].dc[0];j++)
     93                 scanf("%d",&p[i].dc[j]);
     94             }
     95             else if(strcmp(ch,"IR")==0)              //记录增加的行
     96             {
     97                 scanf("%d",&p[i].ir[0]);
     98                 p[i].ex=2;
     99                 for(j=1;j<=p[i].ir[0];j++)
    100                 scanf("%d",&p[i].ir[j]);
    101             }
    102             else if(strcmp(ch,"IC")==0)              //记录增加的列
    103             {
    104                 scanf("%d",&p[i].ic[0]);
    105                 p[i].ex=3;
    106                 for(j=1;j<=p[i].ic[0];j++)
    107                 scanf("%d",&p[i].ic[j]);
    108             }
    109             else if(strcmp(ch,"EX")==0)            //记录交换的点
    110             {
    111                 scanf("%d%d%d%d",&p[i].jx,&p[i].jy,&p[i].jjx,&p[i].jjy);
    112                 p[i].ex=4;
    113             }
    114         }
    115         if(l)
    116         puts("");        
    117         scanf("%d",&x);
    118         printf("Spreadsheet #%d
    ",++l);
    119         for(i=0;i<x;i++)
    120         {
    121             int xx,yy,x1,y1,g=1;
    122             scanf("%d%d",&xx,&yy);
    123             x1=xx,y1=yy;               //将当前的点保存下来
    124             for(j=0;j<t;j++)
    125             {
    126                 g=step(p[j].ex,p[j],xx,yy);
    127 //printf("%d -- %d
    ",xx,yy);// 如果g=0,这个点被删除,直接跳出循环
    128                 if(!g)break;
    129             }        
    130             if(g)
    131             printf("Cell data in (%d,%d) moved to (%d,%d)
    ",x1,y1,xx,yy);
    132             else 
    133             printf("Cell data in (%d,%d) GONE
    ",x1,y1);            
    134         }
    135         
    136     }
    137 }
  • 相关阅读:
    计算任意两个日期的间隔天数
    题目标题: 排它平方数
    历届试题 剪格子
    历届试题 翻硬币
    C语言中%d,%o,%f,%e,%x的意义
    历届试题 买不到的数目
    九度 OJ1008 hdu 3790
    南洋理工 OJ 115 城市平乱 dijstra算法
    蓝桥杯 错误票据 原创代码+思路
    历届试题 连号区间数
  • 原文地址:https://www.cnblogs.com/tzcacm/p/6777737.html
Copyright © 2020-2023  润新知