UVa 512 Spreadsheet Tracking
程序员文章站
2024-03-19 08:25:16
...
题意
有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1~r,列从左到右编号为1 ~c。你的任务是模拟n个操作。具体来说一共有5种操作:
EX r1 c1 r2 c2交换单元格(r1,c1),(r2,c2)。
DR/DC/IR/IC A x1 x2 … xA 插入或删除A行或列(DC-删除列,DR-删除行,IC-插入 列,IR-插入行,1≤A≤10)。
在插入/删除指令后,各个x值不同,且顺序任意。接下来是q个查询,每个查询格式 为“r c”,表示查询原始表格的单元格(r,c)。对于每个查询,输出操作执行完后该单元格的新 位置。输入保证在任意时刻行列数均不超过50
思路
共有两种思路。一种是先模拟操作,每次查询立刻返回结果。另一种是先记录下操作,查询时进行一边操作,返回结果。相比较而言,后者更加好写,效率更高。下面代码为第二种思路。
代码
//#define LOCAL
#include <bits/stdc++.h>
using namespace std;
#define DBG printf("Everything is OK!\n")
#define mem(t, v) memset ((t) , v, sizeof(t))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define eps 1e-6
#define ll long long
const ll mod = 1e9 + 7;
struct Cmd {
string s;
int k[15];
}cmd[100];
int R, C, oper, query, rt, ct, fx, fy;
void cmmd(int x, int y) {
for(int i = 1; i <= oper; i++) {
int cnt = 0;
if(cmd[i].s == "DR") {
for(int j = 1; j <= cmd[i].k[0]; j++) {
if(cmd[i].k[j] < x)
cnt++;
else if(cmd[i].k[j] == x) {
printf("GONE\n");
return;
}
}
x -= cnt;
}
else if(cmd[i].s == "DC") {
for(int j = 1; j <= cmd[i].k[0]; j++) {
if(cmd[i].k[j] < y)
cnt++;
else if(cmd[i].k[j] == y) {
printf("GONE\n");
return;
}
}
y -= cnt;
}
else if(cmd[i].s == "IR") {
for(int j = 1; j <= cmd[i].k[0]; j++) {
if(cmd[i].k[j] <= x)
cnt++;
}
x += cnt;
}
else if(cmd[i].s == "IC") {
for(int j = 1; j <= cmd[i].k[0]; j++) {
if(cmd[i].k[j] <= y)
cnt++;
}
y += cnt;
}
else {
if(cmd[i].k[1] == x && cmd[i].k[2] == y) {
x = cmd[i].k[3];
y = cmd[i].k[4];
}
else if(cmd[i].k[3] == x && cmd[i].k[4] == y) {
x = cmd[i].k[1];
y = cmd[i].k[2];
}
}
}
printf("moved to (%d,%d)\n", x, y);
return ;
}
int main(void) {
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("wdata.out", "w", stdout);
#endif
int num = 0;
while(scanf("%d %d", &R, &C) == 2 && R != 0) {
scanf("%d", &oper);
for(int i = 1; i <= oper; i++) {
cin >> cmd[i].s;
if(cmd[i].s != "EX") {
scanf("%d", &cmd[i].k[0]);
for(int j = 1; j <= cmd[i].k[0]; j++)
scanf("%d", &cmd[i].k[j]);
}
else {
for(int j = 1; j <= 4; j++)
scanf("%d", &cmd[i].k[j]);
}
}
scanf("%d", &query);
if(num > 0)
printf("\n");
printf("Spreadsheet #%d\n", ++num);
while(query--) {
scanf("%d %d", &rt, &ct);
printf("Cell data in (%d,%d) ", rt, ct);
cmmd(rt, ct);
}
}
return 0;
}