木块问题

题目大意:

输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。

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的堆上。

当输入quit时,结束操作并输出0~n-1的位置上的木块情况


#include<iostream>
#include<vector>
#include<string>
using namespace std;

const int MAX = 25;
int n;
vector<int> pile[MAX];

void init_block(int n);
void found_block(int a,int& p,int& h);
void show_block();
void clear(int p,int h);
void move(int a ,int ha,int b);
int main(){
    string s1,s2;
    int a,b;
    cin>>n;
    init_block(n);
    show_block();
    while(cin>>s1 && s1!="quit" && cin >> a >> s2 >> b)
    {
        int pa,pb, ha,hb;
        found_block(a,pa,ha);
        found_block(b,pb,hb);

        if(s1 == "move")clear(pa,ha);
        if(s2 == "onto")clear(pb,hb);
        move(a,ha,b);
    }
    cout<<endl<<endl;
    show_block();
}

void init_block(int n)//初始化木块
{
    for(int i=0;i<n;i++)
    {
        pile[i].push_back(i);
    }
}

void found_block(int a,int& p,int& h)//查找a木块的位置
{
    for(p = 0 ; p < n ;p++)
    {
        for(h = 0 ; h < n ; h++)
            if(pile[p][h] == a)return;
    }
}

void show_block(){  //打印出木块
    for(int i = 0;i < n;i++)
    {
        cout<<i<<":";
        for(int j = 0;j<pile[i].size();j++)
        {
            cout<<" "<<pile[i][j];
        }
        cout << endl ;
    }
}

void clear(int p,int h)//将p堆h高度的木块归位,注意:如果木块指为6则他原来就属于第六的数组的
{
    for( int i = h+1 ;i<pile[p].size() ;i++)
    {
        int x = pile[p][i];
        pile[x].push_back(x);
    }
    pile[p].resize(h + 1);
}

void move(int a,int ha ,int b)//将a以及a上面的木块移动到b上
{
    for(int i = ha;i < pile[a].size() ;i++)
    {
        pile[b].push_back(pile[a][i]);
    }
    pile[a].resize(ha);
}









 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值