首页 > 解决方案 > 陷入电子表格跟踪 (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;
}

还是我无法以这种方式解决问题?谢谢你的帮助。

标签: c++algorithm

解决方案


推荐阅读