The Blocks Problem (木块问题) (vector)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuewenyao/article/details/81741734

题目链接:The Blocks Problem

题意:从左到右有n个木块,编号为0~n-1  ,要求模拟一下四种操作(a,b是木块的编号)

**move a onto b:  把a和b上方的木块全部归位,然后把a摞在b上面。

**move a over b:  把a上方的木块全部归位,然后把a放在b所在木块堆的顶部。

**pile a onto b:把b及上面的木块整体摞在b所偶在木块堆的顶部,

**pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。

分析:每一个木块堆的高度不确定,所以用vector来保存比较合适,而木块堆的个数不超过n,所以用一个数组来存储就可以。

代码如下(刘汝佳上的板子):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

const int maxn = 101;
vector<int>pile[maxn];
int n ;

//找木块儿 a 所在的pp 和h , 以引用的形式返回调用者
void find_block(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 ;
    }
}

//把第p堆高度为h的木块上方的所有木块返回原位
void clear_above(int p , int h)
{
    for(int i = h + 1 ; i < pile[p].size() ; i ++)
    {
        int b = pile[p][i];
        pile[b].push_back(b);
    }
    pile[p].resize(h+1);
}

//把第p堆高度为h及其上方的木块儿整体移动到p2堆的顶部
void pile_onto(int p , int h , int p2)
{
    for(int i = h ; i < pile[p].size() ; i ++)
        pile[p2].push_back(pile[p][i]);
        pile[p].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]);
            printf("\n");
}
}

int main()
{
    int a , b ;
    string s1 ,s2;
    cin>>n;
    for(int i = 0 ; i < n ; i ++)
        pile[i].push_back(i);
    while(cin>>s1>>a>>s2>>b)
    {
        int pa , pb , ha , hb;
        find_block(a,pa,ha);
        find_block(b,pb,hb);
        if(pa == pb)   //处理非法指令
            continue;
        if(s2 == "onto")
            clear_above(pb,hb);
        if(s1 == "move")
            clear_above(pa,ha);
        pile_onto(pa,ha,pb);
    }
    print();
    return 0 ;
}

代码分析:代码的核心就是vector<int>pile[maxn],所有的操作都是基于vector进行的,vector就像是一个二维数组,知识第一个一维的是固定的maxn,但第二维的大小不固定。

扫描二维码关注公众号,回复: 4924854 查看本文章

提示:vector头文件中的vector是一个不定长数组,可以用clear()清空,resize()改变大小,push_back()和pop_back()在尾部添加和删除元素,用empty()测试容器是否为空,vector之间可以直接赋值或者作为函数的返回值。

猜你喜欢

转载自blog.csdn.net/yuewenyao/article/details/81741734
今日推荐