UVA-4.5-追踪单元格-512

UVA-4.5-追踪单元格-512
题目描述:
=,=太长不想写
链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=832&page=show_problem&problem=453
大意就是对表格进行增添删除列或者行的操作,寻找操作前和操作后某单元格的位置的变回,也就是追踪单元格。
题目分析:
这个题我想的办法是建立两个一摸一样的表格,对每个单元格用数字进行标记,操作完成后查找标记数字的位置就可以了。
对于每种操作,可以写一个函数来实现,注意题目中的增删行列是整体增删,比如散去第二行和第四行,不是在散去第二行后在新形成的表格中删去第四行,而是在旧表格中删去第二行和第四行。
这里我想用数组存下要删去或者增加的行和列,注意要进行排序,然后运用关系式进行改变。
注意:一开始写代码的时候注意到了要排序,但是后来犯懒没写,导致WA了好多次
TAT。

给出代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//int num[110][110];
void EX(int p[110][110],int *m,int *n)
{
    //printf("1\n");
    int a,b,c,d,t;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    t=p[a][b];
    p[a][b]=p[c][d];
    p[c][d]=t;
}
void DC(int p[110][110],int *m,int *n)
{
    //printf("2\n");
    int N,i,j,k,t;
    scanf("%d",&N);
    int num[50];
    for(i=0;i<N;i++)
        scanf("%d",&num[i]);
    for(i=0;i<N-1;i++)
      for(j=0;j<N-1-i;j++)
    {
        if(num[j]>num[j+1])
        {
            t=num[j];
            num[j]=num[j+1];
            num[j+1]=t;
        }
    }
    for(k=0;k<N;k++)
    {
        int a=num[k]-k;
        //scanf("%d",&a);
        //int i,j;
        for(i=1;i<=*m;i++)
        {
            for(j=a;j<*n;j++)
            {
                p[i][j]=p[i][j+1];
            }
        }
        *n=*n-1;
    }
}
void DR(int p[110][110],int *m,int *n)
{
    //printf("3\n");
    int N,i,j,k,t;
    scanf("%d",&N);
    int num[50];
    for(i=0;i<N;i++)
        scanf("%d",&num[i]);
    for(i=0;i<N-1;i++)
      for(j=0;j<N-1-i;j++)
    {
        if(num[j]>num[j+1])
        {
            t=num[j];
            num[j]=num[j+1];
            num[j+1]=t;
        }
    }
   for(k=0;k<N;k++)
   {
       int a=num[k]-k;
       for(i=1;i<=*n;i++)
        {
            for(j=a;j<*m;j++)
            {
                p[j][i]=p[j+1][i];
                //printf("i=%d,j=%d\n",i,j);
            }
        }
        *m=*m-1;
   }
}
void IC(int p[110][110],int *m,int *n)
{
    //printf("4\n");
    int N;
    scanf("%d",&N);
    int num[50],i,j,k,t;
    for(i=0;i<N;i++)
        scanf("%d",&num[i]);
    for(i=0;i<N-1;i++)
      for(j=0;j<N-i-1;j++)
    {
        if(num[j]>num[j+1])
        {
            t=num[j];
            num[j]=num[j+1];
            num[j+1]=t;
        }
    }
    for(k=0;k<N;k++)
    {
        int a=num[k]+k;
        for(i=1;i<=*m;i++)
        {
            for(j=*n+1;j>=a;j--)
            {
                if(j!=a)
                {
                    p[i][j]=p[i][j-1];
                }
                else
                {
                    p[i][j]=0;
                }
            }
        }
        *n=*n+1;
    }
}
void IR(int p[110][110],int *m,int *n)
{
    //printf("5\n");
    int N,i,j,k,t;
    scanf("%d",&N);
    int num[50];
    for(i=0;i<N;i++)
        scanf("%d",&num[i]);
    for(i=0;i<N-1;i++)
      for(j=0;j<N-i-1;j++)
    {
        if(num[j]>num[j+1])
        {
            t=num[j];
            num[j]=num[j+1];
            num[j+1]=t;
        }
    }
    for(k=0;k<N;k++)
    {
        int a=num[k]+k;
        for(i=1;i<=*n;i++)
        {
            for(j=*m+1;j>=a;j--)
            {
                if(j!=a)
                {
                    p[j][i]=p[j-1][i];
                }
                else
                {
                    p[j][i]=0;
                }
            }
        }
        *m=*m+1;
    }
}
int main()
{

       int book1=0;
       int m,n;
       while(scanf("%d%d",&m,&n)!=EOF)
       {
           if(m==0&&n==0)
           break;
       book1++;
       if(book1!=1)
        printf("\n");
      int num1[110][110];
      int num2[110][110];
      //int m,n;
      memset(num1,0,sizeof(num1));
      memset(num2,0,sizeof(num2));
      //scanf("%d%d",&m,&n);
      int count=0;
      int i,j;
      for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
      {
          count++;
          num1[i][j]=count;
          num2[i][j]=count;
      }
      int num;
      scanf("%d",&num);
      char comd[5];
      while(num--)
      {
          scanf("%s",comd);
          //printf("%s\n",comd);
          int k=strcmp(comd,"DR");
          if(k==0)
          {
              DR(num1,&m,&n);
          }
          else
          {
              k=strcmp(comd,"DC");
              if(k==0)
              {
                  DC(num1,&m,&n);
              }
              else
              {
                  k=strcmp(comd,"IR");
                  if(k==0)
                  {
                      IR(num1,&m,&n);
                  }
                  else
                  {
                      k=strcmp(comd,"IC");
                      if(k==0)
                      {
                          IC(num1,&m,&n);
                      }
                      else
                      {
                          EX(num1,&m,&n);
                      }
                  }
              }
          }
      }
      int N;
      int x,y;
      scanf("%d",&N);
      printf("Spreadsheet #%d\n",book1);
      while(N--)
      {   scanf("%d%d",&x,&y);
          int mark=0;
          int book=num2[x][y];
          for(i=1;i<=m;i++)
          {
              for(j=1;j<=n;j++)
              {
                  if(book==num1[i][j])
                  {
                      //printf("%d %d\n",i,j);
                      mark=1;
                      break;
                  }
              }
            if(mark)
              break;
          }
          if(mark)
            printf("Cell data in (%d,%d) moved to (%d,%d)\n",x,y,i,j);
          else
            printf("Cell data in (%d,%d) GONE\n",x,y);
          mark=0;
      }
        //printf("\n");
       }
       return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值