#include #include #include #include #include

using namespace std;

const int N = 55;

int n; vector block[N]; // 每个位置上的木块,使用 vector 存储

// 找到 x 所在的块和位置 void find_pos(int x, int& p, int& h) { for (p = 0; p < n; p ++ ) for (h = 0; h < block[p].size(); h ++ ) if (block[p][h] == x) return; }

// 将 p 位置上的高度为 h 的木块及以上全部移到原位 void clear_above(int p, int h) { for (int i = h + 1; i < block[p].size(); i ++ ) { int w = block[p][i]; block[w].push_back(w); // 将木块放回原位 } block[p].resize(h + 1); // 调整高度 }

// 将 p 位置上的木块及以上全部移到原位 void clear(int p) { for (int i = 0; i < block[p].size(); i ++ ) { int w = block[p][i]; block[w].push_back(w); // 将木块放回原位 } block[p].clear(); // 清空该位置 }

// 向 p 位置上方添加高度为 h 的木块 void add_above(int p, int h) { for (int i = h; i < block[p].size(); i ++ ) { int w = block[p][i]; block[w].push_back(w); // 将木块放回原位 } block[p].resize(h); // 调整高度 }

// 将 p 位置及以上的所有木块移动到另一个位置 q 上 void move(int p, int q) { int h = block[p].size() - 1; int hq = block[q].size(); for (int i = h; i >= 0; i -- ) { int w = block[p][i]; block[q].push_back(w); // 将木块放到 q 上 block[p].pop_back(); // 从 p 上移除木块 } }

int main() { cin >> n;

// 初始化
for (int i = 0; i < n; i ++ )
    block[i].push_back(i);

// 处理指令
string op1, op2;
int x, y;
while (cin >> op1, op1 != "quit")
{
    cin >> x >> op2 >> y;

    int px, hx, py, hy;
    find_pos(x, px, hx);
    find_pos(y, py, hy);

    if (px == py) continue; // 非法指令

    if (op1 == "move")
    {
        if (op2 == "onto")
        {
            clear_above(px, hx);
            clear_above(py, hy);
            move(px, py);
        }
        else
        {
            clear_above(px, hx);
            move(px, py);
        }
    }
    else
    {
        if (op2 == "onto")
        {
            clear_above(py, hy);
            move(px, py);
        }
        else
            move(px, py);

        add_above(py, hy);
    }
}

// 输出结果
for (int i = 0; i < n; i ++ )
{
    printf("%d:", i);
    for (int j = 0; j < block[i].size(); j ++ )
        printf(" %d", block[i][j]);
    puts("");
}

return 0;
输入整数 n 表示有编号为 1到n 的木块分别放在顺序排列编号为 1~n 的位置。 设 x 和 y 是木块块号。现对这些木块进行操作操作指令有如下四种: mov x to y :把 x 、 y 上的木块放回各自原来的位置再把 木块x 放到木块 y 上; mov x on y :把 x 上的木块放回各自的原来的位置再把 x 放到包含了 y 的木块堆上; shift x to y :把 y 上的

原文地址: https://www.cveoy.top/t/topic/eDCQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录