这道题思路很好理解,一开始没有定义任何别的函数,所有操作都直接在main方法里直接做,长度四千多,一直runtime error,之后将一些操作放到函数中,AC,我连思路都没有变。。。。。吐槽。。。。
#include<bits/stdc++.h>
using namespace std;
vector<int>v[30];
int n;
//记录所在vector数组下标以及在数组中的位置。
void findv(int a,int&a_position,int& a_start){
for(int i=0;i<n;i++)
for(int j=0;j<v[i].size();j++)
if(v[i][j]==a){
a_position=i;
a_start=j;
return;
}
}
//移除b顶部元素,及放到应有位置
void movetop(int b,int b_position,int b_start){
for(int i=b_start+1;i<v[b_position].size();i++)
v[v[b_position][i]].push_back(v[b_position][i]);
v[b_position].erase(v[b_position].begin()+b_start+1,v[b_position].end());
}
//将a之上的所有东西放到b所在的数组最后
void onto(int a_position,int a_start,int b_position){
v[b_position].insert(v[b_position].end(),v[a_position].begin()+a_start,v[a_position].end());
}
//删除a元素,及a之上的元素
void mydelete (int a_position,int a_start){
v[a_position].erase(v[a_position].begin()+a_start,v[a_position].end());
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
v[i].push_back(i);
string s1,s2;
int a,b;
while(cin>>s1){
if(s1=="quit")
break;
cin>>a>>s2>>b;
int a_position,a_start,b_position,b_start;
findv(a,a_position,a_start);
findv(b,b_position,b_start);
if(a_position==b_position)
continue;
if(s1=="move"){
movetop(a,a_position,a_start);
if(s2=="onto"){
movetop(b,b_position,b_start);
}
onto(a_position,a_start,b_position);
mydelete(a_position,a_start);
}
if(s1=="pile"){
if(s2=="onto"){
movetop(b,b_position,b_start);
onto(a_position,a_start,b_position);
}
else{
onto(a_position,a_start,b_position);
}
mydelete(a_position,a_start);
}
}
for(int i=0;i<n;i++){
cout<<i<<":";
for(int j=0;j<v[i].size();j++)
cout<<" "<<v[i][j];
cout<<endl;
}
return 0;
}