点击打开链接(题目)
题意:给你一个n行,m列的表格 要你求出在交换位置,增加行,列,删除行,列的操作之后原本的位置变化到那里。
思路:直接模拟
#include<bits/stdc++.h> using namespace std; const int maxn=100; const int BIG=10000; int r,c,n,d[maxn][maxn],d2[maxn][maxn],ans[maxn][maxn],clos[maxn]; void Copy(char type,int p,int q){ if(type=='R'){ for(int i=1;i<=c;i++) d[p][i]=d2[q][i]; }else{ for(int i=1;i<=r;i++){ d[i][p]=d2[i][q]; } } } void del(char type){ memcpy(d2,d,sizeof(d)); int cnt=type=='R'?r:c; int cnt2=0; for(int i=1;i<=cnt;i++){ if(!clos[i]) Copy(type,++cnt2,i); } if(type=='R') r=cnt2; else c=cnt2; } void ins(char type){ memcpy(d2,d,sizeof(d)); int cnt=type=='R'?r:c; int cnt2=0; for(int i=1;i<=cnt;i++){ if(clos[i]) Copy(type,++cnt2,0); Copy(type,++cnt2,i); } if(type=='R') r=cnt2; else c=cnt2; } int main(){ //freopen("data.in","r",stdin); int r1,c1,r2,c2,q,kase=0; char cmd[10]; memset(d,0,sizeof(d)); while(scanf("%d%d%d",&r,&c,&n)==3&&r){ int r0=r,c0=c; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) d[i][j]=i*BIG+j; while(n--){ scanf("%s",cmd); if(cmd[0]=='E'){ scanf("%d%d%d%d",&r1,&c1,&r2,&c2); int t=d[r1][c1]; d[r1][c1]=d[r2][c2]; d[r2][c2]=t; }else{ int a,x; scanf("%d",&a); memset(clos,0,sizeof(clos)); for(int i=0;i<a;i++) { scanf("%d",&x); clos[x]=1; } if(cmd[0]=='D') del(cmd[1]); else ins(cmd[1]); } } memset(ans,0,sizeof(ans)); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) ans[d[i][j]/BIG][d[i][j]%BIG]=i*BIG+j; if(kase>0) printf("\n"); printf("Spreadsheet #%d\n",++kase); scanf("%d",&q); while(q--){ scanf("%d%d",&r1,&c1); printf("Cell data in (%d,%d) ",r1,c1); if(ans[r1][c1]==0) printf("GONE\n"); else printf("moved to (%d,%d)\n",ans[r1][c1]/BIG,ans[r1][c1]%BIG); } } return 0; }