补一下之前没上传的LRJ紫书例题。
本题就是一个稍长的模拟,我当时是用c写的,所以比较冗长。这道题并没有什么思想难度,建议独立实现。
原题:
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define DEBUG
typedef struct
{
int r;
int c;
}Point;
const char *compare_source[5]={"EX","DC","DR","IC","IR"};
Point Spreadsheet[100][100];
int r,c;
int i,j;
int compare(const void *a,const void *b);
void EX(int r1,int c1,int r2,int c2);
void DC(int c0);
void DR(int r0);
void IC(int c0);
void IR(int r0);
int main(void)
{
int flag_interval=0,cnt=1;
while(scanf("%d %d",&r,&c)&&r*c!=0)
{
memset(Spreadsheet,0,sizeof(Spreadsheet));
if(!flag_interval)
{
flag_interval=!flag_interval;
}
else
{
printf("\n");
}
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
Spreadsheet[i][j].r=i;
Spreadsheet[i][j].c=j;
}
}
#ifndef DEBUG
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
printf("(%d,%d) ",Spreadsheet[i][j].r,Spreadsheet[i][j].c);
if(j==c)
{
printf("\n");
}
}
}
#endif
int n;
int A;
scanf("%d",&n);
while(n--)
{
char temp_string[5];
scanf("%s",temp_string);
int K=0;
int store_r0[20]={0};
int store_c0[20]={0};
if(strcmp(temp_string,compare_source[0])==0)
{
int r1,c1,r2,c2;
scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
EX(r1,c1,r2,c2);
}
else if(strcmp(temp_string,compare_source[1])==0)
{
scanf("%d",&A);
while(K<A)
{
scanf("%d",&store_c0[K++]);
}
qsort(store_c0,A,sizeof(int),compare);
A--;
while(A>=0)
{
c--;
DC(store_c0[A--]);
}
}
else if(strcmp(temp_string,compare_source[2])==0)
{
scanf("%d",&A);
while(K<A)
{
scanf("%d",&store_r0[K++]);
}
qsort(store_r0,A,sizeof(int),compare);
A--;
while(A>=0)
{
r--;
DR(store_r0[A--]);
}
}
else if(strcmp(temp_string,compare_source[3])==0)
{
scanf("%d",&A);
while(K<A)
{
scanf("%d",&store_c0[K++]);
}
qsort(store_c0,A,sizeof(int),compare);
A--;
while(A>=0)
{
c++;
IC(store_c0[A--]);
}
}
else
{
scanf("%d",&A);
while(K<A)
{
scanf("%d",&store_r0[K++]);
}
qsort(store_r0,A,sizeof(int),compare);
A--;
while(A>=0)
{
r++;
IR(store_r0[A--]);
}
}
}
printf("Spreadsheet #%d\n",cnt++);
int N;
scanf("%d",&N);
while(N--)
{
int r0,c0;
scanf("%d%d",&r0,&c0);
printf("Cell data in (%d,%d) ",r0,c0);
int ansr=0,ansc=0;
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
if(Spreadsheet[i][j].r==r0&&Spreadsheet[i][j].c==c0)
{
ansr=i;
ansc=j;
break;
}
}
if(ansr*ansc)
{
break;
}
}
if(ansr*ansc)
{
printf("moved to (%d,%d)\n",ansr,ansc);
}
else
{
printf("GONE\n");
}
}
}
return 0;
}
void EX(int r1,int c1,int r2,int c2)
{
int temp_r,temp_c;
temp_r=Spreadsheet[r1][c1].r;
temp_c=Spreadsheet[r1][c1].c;
Spreadsheet[r1][c1].r=Spreadsheet[r2][c2].r;
Spreadsheet[r1][c1].c=Spreadsheet[r2][c2].c;
Spreadsheet[r2][c2].r=temp_r;
Spreadsheet[r2][c2].c=temp_c;
}
void DC(int c0)
{
for(j=c0;j<=c;j++)
{
for(i=1;i<=r;i++)
{
Spreadsheet[i][j].r=Spreadsheet[i][j+1].r;
Spreadsheet[i][j].c=Spreadsheet[i][j+1].c;
if(j==c)
{
Spreadsheet[i][j+1].r=0;
Spreadsheet[i][j+1].c=0;
}
}
}
}
void DR(int r0)
{
for(i=r0;i<=r;i++)
{
for(j=1;j<=c;j++)
{
Spreadsheet[i][j].r=Spreadsheet[i+1][j].r;
Spreadsheet[i][j].c=Spreadsheet[i+1][j].c;
if(i==r)
{
Spreadsheet[i+1][j].r=0;
Spreadsheet[i+1][j].c=0;
}
}
}
}
void IC(int c0)
{
for(j=c;j>=c0;j--)
{
for(i=1;i<=r;i++)
{
if(j==c0)
{
Spreadsheet[i][j].r=0;
Spreadsheet[i][j].c=0;
}
else
{
Spreadsheet[i][j].r=Spreadsheet[i][j-1].r;
Spreadsheet[i][j].c=Spreadsheet[i][j-1].c;
}
}
}
}
void IR(int r0)
{
for(i=r;i>=r0;i--)
{
for(j=1;j<=c;j++)
{
if(i==r0)
{
Spreadsheet[i][j].r=0;
Spreadsheet[i][j].c=0;
}
else
{
Spreadsheet[i][j].r=Spreadsheet[i-1][j].r;
Spreadsheet[i][j].c=Spreadsheet[i-1][j].c;
}
}
}
}
int compare(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
?
|