uva101

           本题一共四个命令:

            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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值