背景: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;
}