背景:wrong了10个多小时,最后发现格式错了。
思路:这是一道模拟题,思路比较简单,先把要执行的命令用结构体存储,如果用数组的话,会比较麻烦,然后在模拟所输入单元格的操作即可。最主要的一点就是如何模拟整个操作,使得他不重不漏。
#include <stdio.h>
#include <string.h>
int r=0,c=0,n1;
struct order
{
int n,x[100],m;
}ord[10000];
void change(void)
{
for(int i=0;i<n1;i++)
{
if(ord[i].m==1)
{
if(ord[i].x[0]==r&&ord[i].x[1]==c) {r=ord[i].x[2];c=ord[i].x[3];}
else if(ord[i].x[2]==r&&ord[i].x[3]==c) {r=ord[i].x[0];c=ord[i].x[1];}
}
else
{
int dr=0,dc=0;
for(int j=0;j<ord[i].n;j++)
{
if(ord[i].m==2)
{
if(ord[i].x[j]<r) dr--;
else if(ord[i].x[j]==r) {r=0;return;}
}
if(ord[i].m==3)
{
if(ord[i].x[j]<c) dc--;
else if(ord[i].x[j]==c) {r=0;return;}
}
if(ord[i].m==4)
if(ord[i].x[j]<=c) dc++;
if(ord[i].m==5)
if(ord[i].x[j]<=r) dr++;
}
r+=dr;c+=dc;
}
}
}
void Gets(int i)
{
char str[5];
scanf("%s",str);
if(str[0]=='E'&&str[1]=='X') ord[i].m=1;
if(str[0]=='D'&&str[1]=='R') ord[i].m=2;
if(str[0]=='D'&&str[1]=='C') ord[i].m=3;
if(str[0]=='I'&&str[1]=='C') ord[i].m=4;
if(str[0]=='I'&&str[1]=='R') ord[i].m=5;
if(ord[i].m==1) for(int j=0;j<4;j++) scanf("%d",&ord[i].x[j]);
if(ord[i].m!=1)
{
scanf("%d",&ord[i].n);
for(int j=0;j<ord[i].n;j++) scanf("%d",&ord[i].x[j]);
}
}
int main(void)
{
int m,n,f=0;
while(scanf("%d %d",&m,&n)==2&&m&&n)
{
scanf("%d",&n1);
if(f>0) printf("\n");
printf("Spreadsheet #%d\n",++f);
for(int i=0;i<n1;i++) Gets(i);
int n2;
scanf("%d",&n2);
for(int k=0;k<n2;k++)
{
scanf("%d%d",&r,&c);
printf("Cell data in (%d,%d) ",r,c);
change();
if(r) printf("moved to (%d,%d)\n",r,c);
else printf("GONE\n");
}
}
return 0;
}