这种模拟题如果不好好读题那么难度可是成倍增加,这是向量的一道练习题,读题目发现其实就只有两个操作,一个是把某个木块上面的木块归位,一个是把某个木块连同它本身移到另一个木块的上面,为了方便这两个进行操作,还需要一个函数来获得输入的两个木块现实的所在的位置,然后按照题目即可,最后一个坑点不要忘记了,如果操作的两个木块在一列,那么这个操作忽略
但是对于第一个归位操作我有一个疑问,要是上面某个元素就在这一列,那么要怎么处理,看了看刘汝佳的代码,他是直接resize,但是这种情况不是还是要放在这一列的上面吗,但是好像啥也不影响,那个样子写也可以
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
vi v[30];
void move1(int x, int y) {
int len = sz(v[x]);
for (int i = y + 1; i < len; i++) v[v[x][i]].pb(v[x][i]);
v[x].erase(v[x].begin() + y + 1, v[x].begin() + len);
}
void move2(int x1, int y1, int x2) {
int len = sz(v[x1]);
for (int i = y1; i < len; i++) v[x2].pb(v[x1][i]);
v[x1].erase(v[x1].begin() + y1, v[x1].begin() + len);
}
pa deal(int x, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < sz(v[i]); j++) {
if (v[i][j] == x) return mk(i, j);
}
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) v[i].pb(i);
string s1, s2;
while (cin >> s1 && s1 != "quit") {
int a, b;
cin >> a >> s2 >> b;
pa p1 = deal(a, n);
pa p2 = deal(b, n);
if (p1.fi == p2.fi) continue;
if (s1 == "move") move1(p1.fi, p1.se);
if (s2 == "onto") move1(p2.fi, p2.se);
move2(p1.fi, p1.se, p2.fi);
}
for (int i = 0; i < n; i++) {
cout << i << ":";
for (int j = 0; j < sz(v[i]); j++) cout << " " << v[i][j];
cout << endl;
}
return 0;
}