UVA512 追踪电子表格中的单元格 Spreadsheet Tracking

真的是,又写了50多分钟,主要是中间出了两个错误,耽误了很多时间,第一个错误是交换操作,没有写else,这样子的话需要交换的时候交换不了,发生逻辑错误,第二个是本题用的是vector,那么每组数据之后是要清空的,至少目前我会的vector的操作很少,只能这样写,这样写的好处就是省去了记录插入删除的数目,vector的size就是,但是坏处就是我出错的地方,

#include <bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;

const int N = 1e4 + 5;

string s[N];

int main() {
    int r, c;
    int num = 1;
    while (cin >> r >> c) {
        if (!r && !c) break;
        if (num > 1) cout << endl;
        cout << "Spreadsheet #" << num++ << endl;
        int n;
        cin >> n;
        vi v[N];
        for (int i = 0; i < n; i++) {
            cin >> s[i];
            if (s[i] != "EX") {
                int x;
                cin >> x;
                for (int j = 0; j < x; j++) { int t; cin >> t; v[i].pb(t); }
                sort(all(v[i]));
            } else {
                for (int j = 0; j < 4; j++) { int t; cin >> t; v[i].bp(t); }
            }
        }
        int q;
        cin >> q;
        while (q--) {
            int x, y;
            cin >> x >> y;
            int xx = x, yy = y;
            int ok = 0;
            for (int i = 0; i < n; i++) {
                if (s[i] == "IR") {
                    int j;
                    for (j = 0; j < sz(v[i]); j++) {
                        if (v[i][j] > x) break;
                    }
                    x += j;
                } else if (s[i] == "IC") {
                    int j;
                    for (j = 0; j < sz(v[i]); j++) {
                        if (v[i][j] > y) break;
                    }
                    y += j;
                } else if (s[i] == "DR") {
                    int cnt = 0;
                    for (int j = 0; j < sz(v[i]); j++) {
                        if (v[i][j] < x) cnt++;
                        if (v[i][j] == x) cnt = -1;
                    }
                    if (cnt == -1) { ok = 1; break; }
                    else x -= cnt;
                } else if (s[i] == "DC") {
                    int cnt = 0;
                    for (int j = 0; j < sz(v[i]); j++) {
                        if (v[i][j] < y) cnt++;
                        if (v[i][j] == y) cnt = -1;
                    }
                    if (cnt == -1) { ok = 1; break; }
                    else y -= cnt;
                } else {
                    int x1 = v[i][0], y1 = v[i][1];
                    int x2 = v[i][2], y2 = v[i][3];
                    if (x1 == x && y1 == y) { x = x2; y = y2; }
                    else if (x2 == x && y2 == y) { x = x1; y = y1; }
                }
            }
            if (ok) printf("Cell data in (%d,%d) GONE\n", xx, yy);
            else printf("Cell data in (%d,%d) moved to (%d,%d)\n", xx, yy, x, y);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值