本题一共四个命令:
1.move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面;
2.move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面;
3.pile a onto b,把b上面的放回原来位置,然后把a和a上面的方块整体放到b上面;
4.pile a over b,把a和a上面的方块整体放到b所在堆的上面。
你就会发现永远是a往b上放,所以只要根据要求,按照要求把木块放回原处,再叠加就可以了。
用stl做更简单。
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
const int maxx=30;
int n;
vector<int >pile[maxx];
void find_dir(int a,int& p,int& h)
{
for(p=0;p<n;p++)
for(h=0;h<pile[p].size();h++)
if(pile[p][h]==a)
return ;
}
void clear_dir(int p,int h)//只需要重置被移走后的size,以防占用空间,然后出现错误
{
for(int i=h+1;i<pile[p].size();i++)
pile[pile[p][i]].push_back(pile[p][i]);
pile[p].resize(h+1);//0到h
}
void onto(int p,int h,int b)
{
for(int i=h;i<pile[p].size();i++)
pile[b].push_back(pile[p][i]);
pile[p].resize(h);//不是h+1,因为h也给移走了
}
int main()
{
int a,b;
int ha,hb,ap,bp;
string s1,s2;
while(scanf("%d",&n)!=EOF&&n>0)
{
for(int i=0;i<n;i++)
pile[i].push_back(i);
while(cin>>s1&&s1!="quit")
{
cin>>a>>s2>>b;
find_dir(a,ap,ha);
find_dir(b,bp,hb);
if(ap==bp)
continue;
if(s2=="onto")
clear_dir(bp,hb);
if(s1=="move")
clear_dir(ap,ha);
onto(ap,ha,bp);
}
for(int v=0;v<n;v++)
{
printf("%d:",v);
for(int v1=0;v1<pile[v].size();v1++)
printf(" %d",pile[v][v1]);
printf("\n");
}
}
return 0;
}