题目链接:Uva101 也可以在这看:Vjudge 先上代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
vector<int> pile[30];
typedef pair<int, int> P;
int n;
P find_block(int num)
{
    P pos;
    for (int i=0; i < n; i++) {
        for (int j=0; j < pile[i].size(); j++) {
            if (pile[i][j] == num) {
                pos.first = i;
                pos.second = j;
            }
        }
    }
    return pos;
}
void clear_pile(int num)        //p表示哪一堆,h表示高度
{
    P pos = find_block(num);
    int p = pos.first; int h = pos.second;
    for (int i = h + 1; i < pile[p].size(); i++) {
        int b = pile[p][i];
        pile[b].push_back(b);
    }
    pile[p].resize(h + 1);
}
int main()
{
    int a, b;
    string com1, com2;
    P des;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        pile[i].push_back(i);
    }
    while (1) {
        cin >> com1;
        if (com1 == "quit")        break;
        cin >> a >> com2 >> b;
        if (find_block(a).first == find_block(b).first)        continue;
        if (com1 == "move"&&com2 == "onto") {
            clear_pile(a);
            clear_pile(b);
            int bpile = find_block(b).first;
            int apile = find_block(a).first;
            pile[bpile].push_back(a);
            int si = pile[apile].size();
            pile[apile].resize(si - 1);
        }
        else if (com1 == "move"&&com2 == "over") {                //这段有问题 
            clear_pile(a);
            int apile = find_block(a).first;
            int bpile = find_block(b).first;
            int si = pile[apile].size();
            pile[bpile].push_back(a);
            pile[apile].resize(si - 1);
        }
        else if (com1 == "pile"&&com2 == "onto") {        //这个操作是先将b上方的方块归位,然后将a以及a上方的方块整体移动到b的上方
            int apile = find_block(a).first;
            int bpile = find_block(b).first;
            int h = find_block(a).second;
            int ori_a_size = pile[apile].size();
            clear_pile(b);                                //将b上方的方块归位
            for (int i = find_block(a).second; i < ori_a_size; i++) {        //循环从b的高度开始(这里是否要+1?)
                pile[bpile].push_back(pile[apile][i]);
            }
            pile[apile].resize(h);
        }
        else if (com1 == "pile"&&com2 == "over") {                //这段有问题
            int bpile = find_block(b).first;
            int apile = find_block(a).first;
            int ori_a_si = pile[apile].size();
            int h = find_block(a).second;
            for (int i = find_block(a).second; i < ori_a_si; i++) {
                pile[bpile].push_back(pile[apile][i]);
            }
            pile[apile].resize(h);
        }
    }
    for (int i = 0; i < n; i++) {
        printf("%d:", i);
        for (int j = 0; j < pile[i].size(); j++) {
            printf(" %d", pile[i][j]);
        }
        printf("\n");
    }
    return 0;
}

思路上其实很直接,就是用vector来模拟方块堆,然后用一个数组将这些vector存起来。放方块的操作用push_back即可。原本是写了一个move函数用来进行放方块的操作的,但后来发现这样做容易出错而且自己也写得不好........ 下面是我写的超丑move函数qwq:

实际使用的时候很不好用,主要是参数设计的不好。