题目:给你n个方块,有四种操作:
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所在堆的上面。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
const int maxn = 30;
int n;
/*
vector 用法
vector<int> v;
v.begin(); //容器的起始位置
v.end(); //容器最后一个位置后的位置
v.front();v.back(); //返回第一个元素(最后一个元素,但不判断时候存在
v.empty(); //返回是否容器为空
v.clear(); //清空容器
v.erase(m); //删除m位置的数据,并返回下一个数据的地址(m是迭代器)
v.erase(m,n); //删除m到n之间的数据,并返回下一个数据的地址
v2.assign(8,1); // 重新给vec2赋值,8个成员的初始值都为1
v.push_back(element); //压入一个元素到末端
v.pop_back(); //弹出最后一个元素
v.reserve(100);v.resize(101); //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位
v.size();v.capacity(); //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建
swap(a,b); //交换两个元素的位置如:swap(v[0],v[1]);
vector<int> v(10); //创建一个前十个元素为int的容器
vector<string> v(10,string("I")); //使容器的前10个元素都为string型,并且都初始化为I
vector<string> v1(v2); //对于已经存在的v2创建一个v1副本
v.insert(place,element);
v.insert(place,n,element); //在place(迭代器)位插入n个元素
//注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全
v[0]; // A
v.at[0]; // B 这样越界的时候比较安全
vector 有两种遍历方法
一种是使用迭代器
vector<int> ::iterator it;
for(it = v.begin(); it!=v.end(); it++)
{
cout<<(*it)<<endl;
}
还有就是直接用下标的方式访问
v[0]; // A
v.at[0]; // B 这样越界的时候比较安全
*/
vector<int> pile[maxn];
//找到木块a所在的pile和height,以引用的形式返回调用者
void find_block(int a, int& p, int& h)
{
for (p = 0; p < n;p++)
for (h = 0; h < pile[p].size(); h++)
{
if (pile[p][h] == a)return;
}
}
//把第p堆高度为h的木块上方的所有木块移回原位
void clear_above(int p, int h)
{
for (int i = h + 1; i < pile[p].size(); i++)
{
int m = pile[p][i];
pile[m].push_back(m);
}
pile[p].resize(h + 1);
}
//把第p堆高度为h及其上方的木块整体移动到p2堆的顶部
void pile_onto(int p, int h,int p2)
{
for (int i = h; i < pile[p].size(); i++)
pile[p2].push_back(pile[p][i]);
pile[p].resize(h);
}
void print()
{
for (int i = 0; i < n; i++)
{
printf("%d:", i);
for (int j = 0; j < pile[i].size(); j++)
printf(" %d", pile[i][j]);
printf("\n");
}
}
int main()
{
int a, b;
cin >> n;
string s1, s2;
for (int i = 0; i < n; i++)pile[i].push_back(i);
while (cin >> s1 >> a >> s2 >> b)
{
int pa, pb, ha, hb;
find_block(a, pa, ha);
find_block(b, pb, hb);
if (pa == pb) continue;//非法指令
if (s2 == "onto") clear_above(pb, hb);
if (s1 == "move") clear_above(pa, ha);
pile_onto(pa, ha, pb);
//if(s1[0]=='q')break;
}
print();
return 0;
}