美文网首页
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