WA on #1 求助
查看原帖
WA on #1 求助
367168
Joker_1212楼主2022/7/18 10:31
/* By @Joker_1212 */
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
using namespace std;

// 优化函数
inline void pre()
{
#ifdef LOCAL
    freopen("./in.in", "rb", stdin);
    freopen("./out.out", "wb", stdout);
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
}

vector<int> arr[25]; // 存每个位置的积木
int p[25];           // 存每个积木的位置

// move a onto b
inline void move_onto(int a, int b)
{
    int pa = p[a], pb = p[b]; // 积木 a 和 b 的位置
    if (pa == pb)             // 位置相同则忽略
        return;
    // a 上面的积木归位
    while (arr[pa][arr[pa].size() - 1] != a)
    {
        int x = arr[pa][arr[pa].size() - 1];
        arr[x].push_back(x);
        arr[pa].pop_back();
        p[x] = x;
    }

    // b 上面的积木归位
    while (arr[pb][arr[pb].size() - 1] != b)
    {
        int x = arr[pb][arr[pb].size() - 1];
        arr[x].push_back(x);
        arr[pb].pop_back();
        p[x] = x;
    }

    // 把 a 放到 b 的上面
    arr[pb].push_back(a);
    arr[pa].pop_back();
    p[a] = pb;
}

// move a over b
inline void move_over(int a, int b)
{
    int pa = p[a], pb = p[b]; // 同 move_onto
    if (pa == pb)
        return;

    // 归位
    while (arr[pa][arr[pa].size() - 1] != a)
    {
        int x = arr[pa][arr[pa].size() - 1];
        arr[x].push_back(x);
        arr[pa].pop_back();
        p[x] = x;
    }

    // 放置
    arr[pb].push_back(a);
    arr[pa].pop_back();
    p[a] = pb;
}

// pile a onto b
inline void pile_onto(int a, int b)
{
    int pa = p[a], pb = p[b],  // 同move_onto
        Stack[25]{0}, cnt = 0; // 临时栈,存储 a 上面的积木
    if (pa == pb)
        return;

    // 归位
    while (arr[pb][arr[pb].size() - 1] != b)
    {
        int x = arr[pb][arr[pb].size() - 1];
        arr[x].push_back(x);
        arr[pb].pop_back();
        p[x] = x;
    }

    // a 上面的积木入栈
    while (arr[pa][arr[pa].size() - 1] != a)
    {
        int x = arr[pa][arr[pa].size() - 1];
        Stack[cnt++] = x;
        arr[pa].pop_back();
    }

    // 放置 a
    arr[pb].push_back(a);
    arr[pa].pop_back();
    p[a] = pb;

    // 按顺序放置 a 上面的积木
    while (cnt)
    {
        int x = Stack[--cnt];
        p[x] = pb;
        arr[pb].push_back(x);
    }
}

// pile a over b
inline void pile_over(int a, int b)
{
    int pa = p[a], pb = p[b],
        Stack[25]{0}, cnt = 0;
    if (pa == pb)
        return;

    // 入栈
    while (arr[pa][arr[pa].size() - 1] != a)
    {
        int x = arr[pa][arr[pa].size() - 1];
        Stack[cnt++] = x;
        arr[pa].pop_back();
    }

    // 放置
    arr[pb].push_back(a);
    arr[pa].pop_back();
    p[a] = pb;
    while (cnt)
    {
        int x = Stack[--cnt];
        p[x] = pb;
        arr[pb].push_back(x);
    }
}

int main()
{
    pre();
    int n, a, b;
    string s;
    stringstream ss;
    cin >> n;
    getline(cin, s); // 读掉换行
    for (int i = 0; i < n; ++i)
        arr[i].push_back(i), p[i] = i;
    for (int i = 0; i < n; ++i)
    {
        getline(cin, s);
        ss.clear();
        ss << s;
        ss >> s;
        if (s == "quit")
            break;
        if (s == "move")
        {
            ss >> a >> s >> b;
            if (s == "over")
                move_over(a, b);
            else
                move_onto(a, b);
        }
        else
        {
            ss >> a >> s >> b;
            if (s == "over")
                pile_over(a, b);
            else
                pile_onto(a, b);
        }
    }
    for (int i = 0; i < n; ++i)
    {
        cout << i << ':';
        for (auto j = arr[i].begin(); j != arr[i].end(); ++j)
            cout << ' ' << *j;
        cout << endl;
    }
    return 0;
}

https://www.luogu.com.cn/record/80045855

2022/7/18 10:31
加载中...