Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 陷入了电子表格跟踪(UVA 512)的思路中,这是一个模拟问题_C++_Algorithm - Fatal编程技术网

C++ 陷入了电子表格跟踪(UVA 512)的思路中,这是一个模拟问题

C++ 陷入了电子表格跟踪(UVA 512)的思路中,这是一个模拟问题,c++,algorithm,C++,Algorithm,最近我试图解决一个关于UVA的问题。电子表格跟踪()。这是一个模拟问题,我试图用这种方法解决这个问题。注意每次操作后原始行/列位于哪个行/列中。因此,我定义了一个deltaR和deltaC数组来存储行/列索引与原始索引之间的距离。以及存储初始行/列的当前索引的行/列数组。我已经实现了Delete和Insert部分,但是我不知道如何实现Exchange部分(我已经尝试了很多次,但都失败了)。你能告诉我如何在这个思路中实现这一部分吗,非常感谢! 这是我的代码,EX part需要修复: #includ

最近我试图解决一个关于UVA的问题。电子表格跟踪()。这是一个模拟问题,我试图用这种方法解决这个问题。注意每次操作后原始行/列位于哪个行/列中。因此,我定义了一个deltaR和deltaC数组来存储行/列索引与原始索引之间的距离。以及存储初始行/列的当前索引的行/列数组。我已经实现了Delete和Insert部分,但是我不知道如何实现Exchange部分(我已经尝试了很多次,但都失败了)。你能告诉我如何在这个思路中实现这一部分吗,非常感谢! 这是我的代码,EX part需要修复:

#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非常抱歉。我已经更新了问题我不知道它是否会更好,但我可能不会尝试跟踪整个电子表格,而是存储命令序列而不评估其效果,存储查询列表,然后只评估查询中的命令。你认为这种方法对你有用吗?好主意,我理解你的意思。重复计算查询中的命令要容易得多。我会自己实施的,谢谢。谢谢,我已经解决了这个问题。但我仍然想知道最初的方法是否有效。我会采用一种方法,设计一个名为电子表格的数据结构,其中包含所需的操作,因为这样更容易理解。