C++ 陷入了电子表格跟踪(UVA 512)的思路中,这是一个模拟问题
最近我试图解决一个关于UVA的问题。电子表格跟踪()。这是一个模拟问题,我试图用这种方法解决这个问题。注意每次操作后原始行/列位于哪个行/列中。因此,我定义了一个deltaR和deltaC数组来存储行/列索引与原始索引之间的距离。以及存储初始行/列的当前索引的行/列数组。我已经实现了Delete和Insert部分,但是我不知道如何实现Exchange部分(我已经尝试了很多次,但都失败了)。你能告诉我如何在这个思路中实现这一部分吗,非常感谢! 这是我的代码,EX part需要修复:C++ 陷入了电子表格跟踪(UVA 512)的思路中,这是一个模拟问题,c++,algorithm,C++,Algorithm,最近我试图解决一个关于UVA的问题。电子表格跟踪()。这是一个模拟问题,我试图用这种方法解决这个问题。注意每次操作后原始行/列位于哪个行/列中。因此,我定义了一个deltaR和deltaC数组来存储行/列索引与原始索引之间的距离。以及存储初始行/列的当前索引的行/列数组。我已经实现了Delete和Insert部分,但是我不知道如何实现Exchange部分(我已经尝试了很多次,但都失败了)。你能告诉我如何在这个思路中实现这一部分吗,非常感谢! 这是我的代码,EX part需要修复: #includ
#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;
}
#包括
使用名称空间std;
typedef对pii;
#定义调试(x)#x非常抱歉。我已经更新了问题我不知道它是否会更好,但我可能不会尝试跟踪整个电子表格,而是存储命令序列而不评估其效果,存储查询列表,然后只评估查询中的命令。你认为这种方法对你有用吗?好主意,我理解你的意思。重复计算查询中的命令要容易得多。我会自己实施的,谢谢。谢谢,我已经解决了这个问题。但我仍然想知道最初的方法是否有效。我会采用一种方法,设计一个名为电子表格的数据结构,其中包含所需的操作,因为这样更容易理解。