uva101

来源:互联网 发布:淘宝详情页的制作步骤 编辑:程序博客网 时间:2024/05/19 01:08

           本题一共四个命令:

            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;}

0 0
原创粉丝点击