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

【题意】

            有一个r行c列的电子表格,行从上到下编号为1~r,列从左到右编号为1~c。对其进行n个操作。操作类型分为5种:

1. 删除行 2. 删除列 3. 插入行 4. 插入列 5. 交换两个元素位置

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

【分析】

            1. 可以直接模拟,但是需要开很多额外空间;

2. 先将n个操作存起来,然后对每个查询分别执行这个n个操作,输出变更后位置。这样节约空间,也很简单方便

【注意】

            注意:1. 在执行DR,DC,IR,IC操作时,必须先将位置(x,y)保存下,见代码,即:xx = x, yy = y;(因为这四个操作是基于初始的位置x,y进行的)
2. 不同的测试用例用空行隔开,最后一个用例不能有空行,开始Wrong answer就因为最后多输出一空行

代码如下:

#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
#include
       
       
        
        
using namespace std;

const int MAX = 10000;
int r,c,n;
struct cmd{//构造结构体类型的变量,其元素包括操作字符串,每个操作要删除或插入的行或列数,两个位置的坐标,方便后面处理
    string s;
    int A,a[20];
    int r1,c1,r2,c2;
}cmds[MAX];

void save(string str, int i)//分别保存每一个处理步骤的具体内容
{
    int A;
    if(str!="EX"){
        cin>>A;//本次操作所要删除或插入的行或列数
        cmds[i].s = str; cmds[i].A = A;
        for(int j=0;j
        
        
          >cmds[i].a[j]; } else if(str=="EX"){//如果所要输入的操作为交换位置,则需要一次输入两个位置的坐标 cmds[i].s = str; cin>>cmds[i].r1>>cmds[i].c1>>cmds[i].r2>>cmds[i].c2; } } bool solve(int& x, int& y) { int xx,yy; for(int i=0;i 
         
           >r>>c) //输入表格的行数和列数 { if(r==0&&c==0) break; //输入行列数为0时结束 cin>>n; //输入操作数 if(icase>0) cout< 
          
            >str; //输入操作步骤 save(str,i); } cout<<"Spreadsheet #"<<++icase< 
           
             >q; //输入有几组测试实例 while(q--) { int x,y,xx,yy; cin>>x>>y; xx = x; yy = y; //输入初始位置,并将初始位置保存 if(solve(x,y)) printf("Cell data in (%d,%d) moved to (%d,%d)\n",xx,yy,x,y); //xx,yy在这里起到保存初始位置的作用 else printf("Cell data in (%d,%d) GONE\n",xx,yy); } } return 0; } 
            
           
          
        
       
       
      
      
     
     
    
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值