解题思路
vector 模拟即可。
参考代码
#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<stack>
#define LL long long
#define LOCAL
const int maxn = 30;
const int N = 100;
using namespace std;
int readint() {
int x; scanf("%d", &x); return x;
}
vector<int> v[maxn];
void get_ph(int x, int &pile, int &h) {
for(int i = 0; i < maxn; i++) {
for(int j = 0; j < v[i].size(); j++) {
if (v[i][j] == x) {
pile = i, h = j;
break;
}
}
}
}
void clear_above(int pile, int h) {
for(int i = h + 1; i < v[pile].size(); i++) {
int now = v[pile][i];
v[now].push_back(now);
}
v[pile].resize(h + 1);
}
void move_onto(int a, int b) {
int pa, pb, ha, hb;
get_ph(a, pa, ha);
get_ph(b, pb, hb);
if (pa != pb) {
clear_above(pa, ha);
clear_above(pb, hb);
v[pa].resize(ha);
v[pb].push_back(a);
}
}
void move_over(int a, int b) {
int pa, pb, ha, hb;
get_ph(a, pa, ha);
get_ph(b, pb, hb);
if (pa != pb) {
clear_above(pa, ha);
v[pb].push_back(a);
v[pa].resize(ha);
}
}
void pile_onto(int a, int b) {
int pa, pb, ha, hb;
get_ph(a, pa, ha);
get_ph(b, pb, hb);
if (pa != pb) {
clear_above(pb, hb);
for(int i = ha; i < v[pa].size(); i++) {
v[pb].push_back(v[pa][i]);
}
v[pa].resize(ha);
}
}
void pile_over(int a, int b) {
int pa, pb, ha, hb;
get_ph(a, pa, ha);
get_ph(b, pb, hb);
if (pa != pb) {
for(int i = ha; i < v[pa].size(); i++) {
v[pb].push_back(v[pa][i]);
}
v[pa].resize(ha);
}
}
int n;
void init() {
for(int i = 0; i < n; i++) v[i].push_back(i);
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
n = readint();
getchar();
char s[N];
init();
while (gets(s)) {
if (s[0] == 'q') break;
char op1[10], op2[10];
int a, b;
sscanf(s, "%s %d %s %d", op1, &a, op2, &b);
if (op1[0] == 'm') {
if (op2[1] == 'n') move_onto(a, b);
else move_over(a, b);
} else {
if (op2[1] == 'n') pile_onto(a, b);
else pile_over(a, b);
}
}
for(int i = 0; i < n; i++) {
printf("%d:", i);
if (!v[i].empty()) {
for(int j = 0; j < v[i].size(); j++) {
printf(" %d", v[i][j]);
}
}
printf("\n");
}
return 0;
}