传送门
这道模拟题思路很好,使用/和%,刘汝佳说直接看代码理解,确实可以的,思路很好。
//模拟
#include
#include
#include
using namespace std;
const int maxd=100;
const int big=10000;
int r,c,n,d[maxd][maxd],d2[maxd][maxd],ans[maxd][maxd],cols[maxd];
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,cnt2=0;
for(int i=1;i<=cnt;i++){
if(!cols[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,cnt2=0;
for(int i=1;i<=cnt;i++){
if(cols[i]){
copy(type,++cnt2,0);
}
copy(type,++cnt2,i);
}
if(type=='R'){
r=cnt2;
}else{
c=cnt2;
}
}
int main()
{
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(cols,0,sizeof(cols));
for(int i=0;i0){
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;
}
另外一种是将所有的操作保存起来,每次询问都重新执行一次,不需要记录整个表格的变化,方法更加巧妙与高效
//直接将所有操作保存
#include
#include
using namespace std;
const int maxd=10005;
struct commad{
char c[5];
int r1,c1,r2,c2;
int a,x[20];
};
commad cmd[maxd];
int r,c,n;
int simulate(int *r0,int *c0)
{
for(int i=0;i0){
printf("\n");
}
printf("Spreadsheet #%d\n",++casen);
int q,r0,c0;
scanf("%d",&q);
while(q--){
scanf("%d%d",&r0,&c0);
printf("Cell data in (%d,%d) ",r0,c0);
if(!simulate(&r0,&c0)){
printf("GONE\n");
}else{
printf("moved to (%d,%d)\n",r0,c0);
}
}
}
return 0;
}