UVA-4.5-追踪单元格-512

来源:互联网 发布:淘宝怎么申请买保健品 编辑:程序博客网 时间:2024/06/13 13:33

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;}
0 0
原创粉丝点击