Finals好难啊
我好菜啊
好难受啊
#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 100 #define BIG 10000 using namespace std; int r,c,n;//行 列 命令条数 int d[maxd][maxd];//主图 int d2[maxd][maxd];//工具图 int ans[maxd][maxd]; int cols[maxd];//如果下标是1 那么当前行/列会被处理 void copy(char type, int p, int q)//处理的是行还是列 {//把q赋值给p 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(!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; int cnt2 = 0; for(int i = 1; i <= cnt; i++) { if(cols[i]) { copy(type, ++cnt2, 0);//你这一行要处理 先且住 给你加一行0 } copy(type, ++cnt2, i);//再把你放进新的表里 } if(type == 'R') { r = cnt2; } else { c = cnt2; } } int main() { int r1, c1, r2, c2; int q;//最后要问几个点 int 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; i < a; i++) { scanf("%d",&x); cols[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++) {//现在的d[i][j]是被生活毒打过后的d[i][j] //它里面储存的值 是他来的地方 //我们把每一个d[i][j]的值拆开 看看他从哪里来 //用ans数组存一下他从哪里过来的 //再把ans数组的值设为他现在在哪里苟延残喘 //以至于我们只要在ans里面找他原来的坐标 //拆一下坐标里面的值 //我们就能够知道他当今在哪里鬼混 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; }