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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章