木塊問題

題目大意:

輸入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);
}









 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章