The Blocks Problem



  1. 題目分析:
    本題考點,vector容器

難點:
總結(jié)不同的操作方法的共同點
英語閱讀,理解題意 moves the pile of blocks consisting of block a, and any blocks that are stacked above block a是說a及a以上的積木

  1. 編程中遇到的問題
    如何遇到quit即停止
    一開始考慮 while(cin>>s1>>a>>s2>>b&&s1!="quit"),發(fā)現(xiàn)如果這樣,在輸入一個quit后是不能停止的,因為要在輸入a,s2,b后才會判斷s1

在參考了其他人的方案后,最終代碼如下

#include<iostream>
#include<vector>
using namespace std;
vector<int> pile[30];
int n;//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(pile[p][h]==a)
        return;
    }
}
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);
}
void move(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++)
    {
        cout<<i<<":";
        for(int j=0;j<pile[i].size();j++)
        {
             cout<<" "<<pile[i][j]; 
        } 
         cout<<endl;
    }   
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    pile[i].push_back(i);//給每堆賦初值 
    int a,b,pa,ha,pb,hb;
    string s1,s2;
    while(cin>>s1)
    {   if(s1=="quit")
        break;
        cin>>a>>s2>>b;
        find_block(a,pa,ha);
        find_block(b,pb,hb);
        if(pa==pb)continue;
        if(s1=="move")
        clear_above( pa,ha);
        if(s2=="onto")
        clear_above( pb,hb);
        move(pa,ha,pb); 
    }
    print();
    return 0; 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容