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