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;
}