题目大意:
输入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);
}