1. 程式人生 > >The Blocks Problem (木塊問題) (vector)

The Blocks Problem (木塊問題) (vector)

題意:從左到右有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,但第二維的大小不固定。

提示:vector標頭檔案中的vector是一個不定長陣列,可以用clear()清空,resize()改變大小,push_back()和pop_back()在尾部新增和刪除元素,用empty()測試容器是否為空,vector之間可以直接賦值或者作為函式的返回值。