被虐到麻木的代某
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #include <ctype.h> #include <queue> #include <stack> #include <vector> #include <algorithm> #include <iostream> #define maxd 10000 using namespace std; struct Command//一条命令的所有内容包括于此 { char c[5]; int r1, c1, r2, c2; int a, x[20]; }c***xd]; int r,c,n;//共几行几列几条命令 int simulate(int* r0, int* c0) { for(int i = 0 ; i < n ; i++) { if(cmd[i].c[0] == 'E') {//如果交换到了我(r0,c0)头上 if(cmd[i].r1 == *r0 && cmd[i].c1 == *c0) { *r0 = cmd[i].r2; *c0 = cmd[i].c2; } else if(cmd[i].r2 == *r0 && cmd[i].c2 == *c0) { *r0 = cmd[i].r1; *c0 = cmd[i].c1; } } else { int dr = 0, dc = 0;//一波处理完之后我的坐标的变化量 //就是德尔塔r和德尔塔c for(int j = 0; j < cmd[i].a; j++) { int x = cmd[i].x[j]; if(cmd[i].c[0] == 'I') {//加空白行/列 if(cmd[i].c[1] == 'R' && x <= *r0) {//选中的行/列数小于或者就是我 那我的行/列数++ dr++; } if(cmd[i].c[1] == 'C' && x <= *c0) { dc++; } } else { if(cmd[i].c[1] == 'R' && x == *r0) {//选中我 删掉了 歇逼 return 0; } if(cmd[i].c[1] == 'C' && x == *c0) { return 0; } if(cmd[i].c[1] == 'R' && x < *r0) {//删到我前面的行/列 dr--;//那我行/列数-- } if(cmd[i].c[1] == 'C' && x < *c0) { dc--; } } } *r0 += dr; *c0 += dc; //r = r0 + 德尔塔r //c = c0 + 德尔塔c } } return 1; } int main() { int r0,c0,q,kase = 0;//初始的坐标 问几个点 第几组样例 while(scanf("%d%d%d",&r,&c,&n) == 3 && r) { for(int i = 0; i < n; i++) { scanf("%s",cmd[i].c); if(cmd[i].c[0] == 'E') { scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2); } else { scanf("%d",&cmd[i].a); for(int j = 0; j < cmd[i].a; j++) { scanf("%d",&cmd[i].x[j]); } } } if(kase > 0) { printf("\n"); } printf("Spreadsheet #%d\n", ++kase); 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; }