- 题目分析:
本题考点,vector容器
难点:
总结不同的操作方法的共同点
英语阅读,理解题意 moves the pile of blocks consisting of block a, and any blocks that are stacked above block a是说a及a以上的积木
- 编程中遇到的问题
如何遇到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;
}