题目:

代码:
#include <iostream>
#include <vector>
using namespace std;
const int N = 30;
typedef pair<int, int> PII;
vector<int> p[N];
int n;
PII find(int x)//找到编号为x的木块的位置
{
for(int i = 0; i <n; i++)
{
for(int j = 0; j < p[i].size(); j++)
{
if(p[i][j] == x)
{
return {i, j};
}
}
}
}
void clean(int x, int y)//把(x, y)位置的木块上方木块归位
{
for(int j = y + 1; j < p[x].size(); j++)
{
int t = p[x][j];
p[t].push_back(t);
}
p[x].resize(y + 1);
}
void move(int x1, int y1, int x2)//把(x1, y1)及以上的木块挪到x2最上面
{
for(int j = y1; j < p[x1].size(); j++)
{
p[x2].push_back(p[x1][j]);
}
p[x1].resize(y1);
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
p[i].push_back(i);
}
string op1, op2;
int a, b;
while(cin >> op1 >> a >> op2 >> b)
{
int x1, y1, x2, y2;
PII pa, pb;
pa = find(a);
pb = find(b);
x1 = pa.first; y1 = pa.second;
x2 = pb.first; y2 = pb.second;
if(x1 == x2) continue;
if(op1 == "move")
{
clean(x1, y1);
}
if(op2 == "onto")
{
clean(x2, y2);
}
move(x1, y1, x2);
}
for(int i = 0; i < n; i++)
{
cout << i << ":";
for(int j = 0; j < p[i].size(); j++)
{
cout << " " << p[i][j];
}
cout << endl;
}
return 0;
}
总结:
本题主要考察vector数组的使用,可以通过抽象出操作find()、clear()、move(),然后分情况组合解决问题
坚持编程,我一直在路上!