美文网首页
The Blocks Problem

The Blocks Problem

作者: 可爱得一如既往 | 来源:发表于2018-12-09 13:14 被阅读0次


    1. 题目分析:
      本题考点,vector容器

    难点:
    总结不同的操作方法的共同点
    英语阅读,理解题意 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"),发现如果这样,在输入一个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; 
    }
    

    相关文章

      网友评论

          本文标题:The Blocks Problem

          本文链接:https://www.haomeiwen.com/subject/qywhhqtx.html