STL-vector详解-uva-101

题目:给你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;
}

猜你喜欢

转载自blog.csdn.net/qq_41568836/article/details/81627460