题目链接如下:
Online Judge
这道题还是很繁琐的,花了我不少时间……(然后看到别人的评价“水题”,就超级崩溃……)
刘汝佳用了两种方法来解,这里用的就是他的方法,还是非常巧妙的。 https://www.cnblogs.com/mofushaohua/p/7789533.html
我的解法比较笨拙,就是直接模拟,代码如下:
#include
#include
#include
const int maxx = 51;
int r, c, n, kase, query, u, v, s, t, sz, newr, newc, p, temp;
int sp[maxx][maxx];
int row[maxx * maxx], col[maxx * maxx];
char c1, c2;
int main(){
kase = 0;
while(scanf("%d %d", &r, &c) == 2 && r && c){
if(kase){
printf("\n");
}
printf("Spreadsheet #%d\n", ++kase);
newr = r;
newc = c;
scanf("%d", &n);
std::fill(sp[0], sp[0] + maxx * maxx, 0);
std::fill(row, row + maxx * maxx, 0);
std::fill(col, col + maxx * maxx, 0);
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j){
sp[i][j] = (i - 1) * c + j;
}
}
while(n--){
getchar();
scanf("%c%c", &c1, &c2);
if(c1 == 'E'){
scanf("%d %d %d %d", &u, &v, &s, &t);
std::swap(sp[u][v], sp[s][t]);
} else{
scanf("%d", &sz);
std::vector vec(sz);
for(int i = 0; i < sz; ++i){
scanf("%d", &vec[i]);
}
sort(vec.begin(), vec.end());
if(c1 == 'D'){
p = 0;
if(c2 == 'C'){
newc -= sz;
for(int j = vec[0]; j <= newc; ++j){
while(p < sz && j + p == vec[p]){
p++;
}
for(int i = 1; i <= newr; ++i){
sp[i][j] = sp[i][j + p];
}
}
} else{
newr -= sz;
for(int i = vec[0]; i <= newr; ++i){
while(p < sz && i + p == vec[p]){
p++;
}
for(int j = 1; j <= newc; ++j){
sp[i][j] = sp[i + p][j];
}
}
}
} else{
p = sz;
if(c2 == 'C'){
newc += sz;
for(int j = newc; j >= vec[0]; --j){
if(p > 0 && j - p < vec[p - 1]){
p--;
if(j <= maxx - 1){
for(int i = 1; i <= newr; ++i){
sp[i][j] = 0;
}
}
} else{
if(j <= maxx - 1){
for(int i = 1; i <= newr; ++i){
sp[i][j] = sp[i][j - p];
}
}
}
}
newc = std::min(maxx - 1, newc);
} else{
newr += sz;
for(int i = newr; i >= vec[0]; --i){
if(p > 0 && i - p < vec[p - 1]){
p--;
if(i <= maxx - 1){
for(int j = 1; j <= newc; ++j){
sp[i][j] = 0;
}
}
} else{
if(i <= maxx - 1){
for(int j = 1; j <= newc; ++j){
sp[i][j] = sp[i - p][j];
}
}
}
}
newr = std::min(maxx - 1, newr);
}
}
}
}
for(int i = 1; i <= newr; ++i){
for(int j = 1; j <= newc; ++j){
if(sp[i][j]){
row[sp[i][j]] = i;
col[sp[i][j]] = j;
}
}
}
scanf("%d", &query);
while(query--){
scanf("%d %d", &u, &v);
temp = (u - 1) * c + v;
if(row[temp] == 0){
printf("Cell data in (%d,%d) GONE\n", u, v);
} else{
printf("Cell data in (%d,%d) moved to (%d,%d)\n", u, v, row[temp], col[temp]);
}
}
}
return 0;
}