侧边栏
首页代码

例题5-2 木块问题(The Blocks Problem,Uva 101)

从左到右有n个木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编 号)。
move a onto b:把a和b上方的木块全部归位,然后把a摞在b上面。

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

pile a onto b:把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。

pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。
遇到quit时终止一组数据。a和b在同一堆的指令是非法指令,应当忽略。

 

#include<bits/stdc++.h>
using namespace std;
vector<int>pile[25];
int n;
void find_block(int a,int& p,int &h)
{
    for(p = 0;p < n;p++)
    {
        for(h = 0;h < pile[p].size();h++)
            if(a == pile[p][h]) return;
    }
}
void clear_block(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);
}
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, pa, pb, ha, hb;
    string s1, s2;
    cin >> n;
    for(int i = 0; i < n;i++)
    {
        pile[i].push_back(i);
    }
    while(cin >> s1 >> a >> s2 >> b && s1 != "quit")
    {
        find_block(a, pa, ha);
        find_block(b, pb, hb);
        if(pa == pb) continue;
        if(s1 == "move") clear_block(pa, ha);
        if(s2 == "onto") clear_block(pb, hb);
        pile_onto(pa, ha, pb);
    }
    print();
    return 0;
}

 

 vector<int>a[maxn]  相当于一个二维数组 只是y轴是可变的

调用 a[i].push_back(x);   a[i].resize(x);

posted @ 2020-10-27 22:34  AlexStraightUp  阅读(57)  评论(0编辑  收藏  举报
页脚HTML代码