输入整数 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 上的
#include
using namespace std;
const int N = 55;
int 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;
原文地址: https://www.cveoy.top/t/topic/eDCQ 著作权归作者所有。请勿转载和采集!