c++ - 陷入电子表格跟踪 (UVA 512) 的思路,这是一个模拟问题
问题描述
最近我试图解决一个关于UVA的问题。电子表格跟踪 ( UVA512 )。这是一个模拟问题,我试图以这种方式解决这个问题。在每次操作之后注意原始行/列在哪一行/列中。所以我定义了一个 deltaR 和 deltaC 数组来存储现在行/列的索引和原始索引之间的距离。以及用于存储初始行/列的当前索引的行/列数组。我已经实现了删除和插入部分,但我很困惑如何实现交换部分(我尝试了很多次,但都失败了)。你能告诉我如何在这个思路中实现这部分,非常感谢!这是我的代码,EX部分需要修复:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
#define debug(x) #x << " = " << x << " "
const int inf = 0x3f3f3f3f;
int deltaR[100];
int deltaC[100];
int row[100];
int column[100];
int r, c, q, n, x;
char op[3];
void D(int delta[], int arr[], int len) {
scanf("%d", &n);
while (n--) {
scanf("%d", &x);
int idx = 1;
while (arr[idx] <= x) {
if (arr[idx] == x) {
delta[idx] = inf;
}
++idx;
}
for (idx; idx <= len; ++idx) {
if (delta[idx] == inf) {
continue;
}
delta[idx] -= 1;
}
}
for (int idx = 1; idx <= len; ++idx) {
if (delta[idx] == inf) {
arr[idx] = -1;
continue;
}
arr[idx] = idx + delta[idx];
}
}
void I(int delta[], int arr[], int len) {
scanf("%d", &n);
while (n--) {
scanf("%d", &x);
int idx = 1;
while (arr[idx] < x) {
++idx;
}
for (idx; idx <= len; ++idx) {
if (delta[idx] == inf) {
continue;
}
delta[idx] += 1;
}
}
for (int idx = 1; idx <= len; ++idx) {
if (delta[idx] == inf) {
arr[idx] = -1;
continue;
}
arr[idx] = idx + delta[idx];
}
}
void init(int r, int c) {
memset(row, 0, sizeof(row));
memset(column, 0, sizeof(column));
memset(deltaC, 0, sizeof(deltaC));
memset(deltaR, 0, sizeof(deltaR));
for (int i = 1; i <= r; ++i) {
row[i] = i;
}
for (int i = 1; i <= c; ++i) {
column[i] = i;
}
}
int find(int arr[], int& tar, int len) {
for (int i = 1; i <= len; ++i) {
if (tar == arr[i]) {
tar = i;
return 1;
}
}
return 0;
}
void debugarr(int arr[], int n, string name) {
cout << name << endl;
for (int i = 1; i <= n; ++i) {
cout << arr[i] << " ";
}
cout << endl;
}
void EX(map<pii, pii>& aatb, map<pii, pii>& ahaveb) {
int r1, c1, r2, c2;
scanf("%d%d%d%d", &r1, &c1, &r2, &c2);
//cout << debug(r1) << debug(c1) << debug(r2) << debug(c2) << endl;
find(row, r1, r);
find(row, r2, r);
find(column, c1, c);
find(column, c2, c);
pii p1 = make_pair(r1, c1);
pii p2 = make_pair(r2, c2);
pii d1 = p1, d2 = p2;
if (ahaveb.count(p1)) {
d1 = ahaveb[p1];
}
if (ahaveb.count(p2)) {
d2 = ahaveb[p2];
}
aatb[d1] = p2;
aatb[d2] = p1;
ahaveb[p2] = d1;
ahaveb[p1] = d2;
}
int main(int argc, char const *argv[])
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int cases = 0;
while (scanf("%d%d", &r, &c)) {
if (!r && !c) {
break;
}
if (cases) {
printf("\n");
}
map<pii, pii> aatb;
map<pii, pii> ahaveb;
init(r, c);
scanf("%d", &q);
while (q--) {
scanf("%s", op);
if (!strcmp(op, "DR")) {
D(deltaR, row, r);
//debugarr(deltaR, r, "deltaR");
//debugarr(row, r, "row");
}
else if (!strcmp(op, "IR")) {
I(deltaR, row, r);
//debugarr(deltaR, r, "deltaR");
//debugarr(row, r, "row");
}
else if (!strcmp(op, "DC")) {
D(deltaC, column, c);
//debugarr(deltaC, c, "deltaC");
//debugarr(column, c, "column");
}
else if (!strcmp(op, "IC")) {
I(deltaC, column, c);
//debugarr(deltaC, c, "deltaC");
//debugarr(column, c, "column");
}
else {
EX(aatb, ahaveb);
}
}
printf("Spreadsheet #%d\n", ++cases);
scanf("%d", &q);
int rx, ry, a, b;
while (q--) {
scanf("%d%d", &rx, &ry);
a = rx;
b = ry;
pii p = make_pair(rx, ry);
if (aatb.count(p)) {
a = aatb[p].first;
b = aatb[p].second;
}
if (row[a] == -1 || column[b] == -1) {
printf("Cell data in (%d,%d) GONE\n", rx, ry);
continue;
}
printf("Cell data in (%d,%d) moved to (%d,%d)\n", rx, ry, row[a], column[b]);
}
}
return 0;
}
还是我无法以这种方式解决问题?谢谢你的帮助。
解决方案
推荐阅读
- python - 如何从 python 脚本打开 .cmd 文件
- mysql - SQL - 多个表 - 始终返回数据或 null
- python - 具有多个元信息的时间序列预测 (GRU)
- android - 改进来自 Tensorflow 的对象检测演示中的相机预览
- python - 如何在 queue.get() 中确定队列项来自哪个线程——python
- regex - Logstash 过滤器,如果字段匹配正则表达式不起作用
- javascript - 使用属性更新对象属性中的数组
- mysql - MYSQL - MATCH AGAINST 得分值 = 0 但在 WHERE 子句中 > 0
- javascript - jQuery计数器并添加一个类但不是前两个?
- android - 无法解析符号 ViewModelProviders