#include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
const int maxn = 30;
vector<int> Dui[maxn];
int n;
void print(){
for(int i = 0 ; i<n ; i++){
printf("%d:",i);
for(int j = 0;j<Dui[i].size();j++){
printf(" %d",Dui[i][j]);
}
printf("\n");
}
}
void Find_block(int &p , int &h , int x){
for(p = 0 ; p<n ; p++){ //要找到位置,那么就不能使用局部变量,要让位置变化
for(h = 0 ; h<Dui[p].size(); h++){ //因为在vector中列数是不确定的,可以随时增减
if(Dui[p][h] == x) return; //直接结束调用,因为位置都为全局变量,返回的位置就是p(p1,p2),h(h1,h2)
}
}
}
void Move_back(int p, int h){
int x;
for(int i = h+1 ; i<Dui[p].size() ; i++){
x = Dui[p][i];
Dui[x].push_back(x); //错误点:将应该将x值传入x堆而不是p堆
}
Dui[p].resize(h+1);
}
void Move_change(int pa,int pb,int ha){
for(int i = ha; i<Dui[pa].size() ; i++){
Dui[pb].push_back(Dui[pa][i]);
}
Dui[pa].resize(ha);
}
int main(){
int a,b;
string s1,s2;
cin>>n;
for(int i = 0;i<n;i++){
Dui[i].push_back(i);
}
while(cin>>s1>>a>>s2>>b){
int pa,pb,ha,hb;
Find_block(pa,ha,a); //直接将位置返回给pa,ha;
Find_block(pb,hb,b);
if(pa==pb) continue;
if(s1=="move") Move_back(pa,ha);
if(s2=="onto") Move_back(pb,hb);
Move_change(pa,pb,ha);
}
print();
return 0;
}
/*题目大意:
操作一:a,b上方木块全部归位,把a放在b上 —— move a onto b;
找位置(得到pa,pb,ha,hb)——>归位——>
操作二:a上方木块全归位,把a放在b和上面整体的顶端 —— move a over b;
操作三:把b上的木块归位,把a和上面的整体放在b上 —— pile a onto b;
操作四:把a和上面的整体放在b上面整体上 —— pile a over b;
*/
/*
问题:1.怎么找每一块值的位置?
答:传入堆地址,在堆上的地址,直接for循环遍历找,因为位置都为全局变量,找到后直接返回
2.能不能用==比较字符串内容?
答:在C语言中不可以,在C++中可以(定义string)。因为C语言中的==是用来比较a、b变量的值
如果是字符串,使用==只能比较开头地址了,如果要比较值,使用strcmp();
3.上述时间超出怎么办
答:1)减少函数调用的次数,找到每个方法的共同之处总合
2)查看for循环内的算法是否正确(是否写错变量)
*/
/*
知识点 :如果a是一个vector数组,则:
——vector<int>名字[大小];
1. a.size()读取大小
2. a.resize()改变大小
3. a.push_back()向尾部添加元素
4. a.pop_back()删除最后一个元素
5. 可以用a[].clear()清空,a[].empty()测试是否为空
6. a.back()返回最后一个元素
7. a.insert(&adress , value) 在指定位置插入数据,例如intsert(v.begin,3)
8. a.insert(&adress , amount , value) 在指定位置插入amount个value,
例如insert(v.begin,5,3) 在容器的开头传入五个三
*/