首先每一个木块自成一堆,并分配一个编号。
因为不确定每一个木块堆的高度,所以可以用vector来表示每一堆的木块编号。
P.S. vector的常用操作:
1. vec.push_back() 向尾部插入元素
2. vec.size() 取数组元素个数
3. vec.clear() 清空数组
4.插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
5.删除元素: vec.erase(vec.begin()+2);删除第3个元素
(vector可以使用下标访问元素,而queue, stack不能)
注意几个细节:
1.每一次移动木块时是整体挪动,所以插入数组时要从下往上插入。
2.归位或挪动的循环最大值是pile[x].size(),而不是n
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int n;
vector<int> pile[30];
void find_b(int x, int &p, int &h) {
for (p=0; p<n; p++)
for (h=0; h<pile[p].size(); h++)
if (pile[p][h] == x) return;
}
void moveback(int p, int h) {
for (int i=h+1; i<pile[p].size(); i++) {
int a = pile[p][i];
pile[a].push_back(a);
}
pile[p].resize(h+1);
}
void moveon(int pa, int h, int pb) {
for (int i=h; i<pile[pa].size(); i++) pile[pb].push_back(pile[pa][i]);
pile[pa].resize(h);
}
void print() {
for (int i=0; i<n; i++) {
printf("%d:",i);
for (int j=0; j<pile[i].size(); j++)
printf(" %d",pile[i][j]);
cout<<endl;
}
}
int main()
{
cin>>n;
for (int i=0;i<n;i++) pile[i].push_back(i);
string s1,s2;
int a,b;
while (cin >> s1 >> a >> s2 >> b && s1!="quit") {
int pa,ha,pb,hb;
find_b(a, pa, ha);
find_b(b, pb, hb);
if (pa == pb) continue;
if (s1 == "move") moveback(pa, ha);
if (s2 == "onto") moveback(pb, hb);
moveon(pa, ha, pb);
}
print();
return 0;
}