UVa 木块问题(The Blocks Problem 101)——STL中vector在处理不定长数组的优越性

版权声明:有善始者实繁,能克终者盖寡。 https://blog.csdn.net/weixin_43987810/article/details/86613313

学习:
1、vector中的push_back, resize, size等函数的使用。
2、当遇到多组指令的时候,要找到各个指令之间的相似性, 以便写一个普遍性函数用于处理多组指令从而减少重复代码,而不是把所有指令全写成函数(阔怕!)

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

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

void b_find(int a, int& p, int& h);
void p_clear(int p, int h);//delete the blocks above this block
void p_over(int pa, int ha, int pb);
void print();

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)
    {
        if(s1 == "quit")
            break;
        cin >> a >> s2 >> b;
        int pa, ha, pb, hb;

        b_find(a, pa, ha);
        b_find(b, pb, hb);
        if(pa == pb)
            continue;
        if(s1 == "move")
            p_clear(pa, ha);
        if(s2 == "onto")
            p_clear(pb, hb);
        p_over(pa, ha, pb);
    }
    print();

    return 0;
}

void b_find(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 p_clear(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 p_over(int pa, int ha, int pb)
{
    for(int h = ha; h < pile[pa].size(); h++)
        pile[pb].push_back(pile[pa][h]);
    pile[pa].resize(ha);
}
void print()
{
    for(int p = 0; p < n; p++)
    {
        printf("%d:", p);
        for(int h = 0; h < pile[p].size(); h++)
            printf(" %d", pile[p][h]);
        cout << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43987810/article/details/86613313