我们可以从题目中抽取两种相同的动作:
- 将 x x x上面的木块放回原来编号的位置
- 将 x x x与上面的一摞木块移到编号为 y y y的位置
而当第二个操作为onto
的时候,就将
b
b
b执行操作1,而后面如果第一操作为pile
的话,直接对
a
a
a执行二号操作,否则对
a
a
a执行一号操作后在做一点处理即可。
流程图如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> stck[30];
int n;
int find(int x){
for(int i=0;i<x;i++){
for(auto jp:stck[i]){
if(jp==x) return i;
}
}
}
void onto(int x,int posx){
bool fl=false;
int cnt=0;
for(auto ip:stck[posx]){
if(fl) stck[ip].push_back(ip),cnt++;
if(ip==x) fl=true;
}
stck[posx].resize(stck[posx].size()-cnt);
}
void pile(int x,int posx,int posy){
bool fl=false;
int cnt=0;
for(auto ip:stck[posx]){
if(ip==x) fl=true;
if(fl) stck[posy].push_back(ip),cnt++;
}
stck[posx].resize(stck[posx].size()-cnt);
}
int main(){
cin>>n;
for(int i=0;i<n;i++) stck[i].push_back(i);
while(true){
string instu,arg;
int a,b,posa=-1,posb=-1;
cin>>instu;
if(instu=="quit") break;
else{
cin>>a>>arg>>b;
posa=find(a);
posb=find(b);
if(a==b||posa==posb) continue;
if(arg=="onto") onto(b,posb);
if(instu=="pile") pile(a,posa,posb);
else{
onto(a,posa);
stck[posb].push_back(a);
stck[posa].pop_back();
}//这里
}
}
for(int i=0;i<n;i++){
cout<<i<<":";
for(auto jt:stck[i]) cout<<" "<<jt;
cout<<endl;
}
return 0;
}