向量容器vector

向量容器vector

(本文为笔者个人学习笔记,如有不当之处恳请各位读者指正)

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组(不需要定义数组的长度),能够增加和压缩数据。为了可以使用vector,必须在你的头文件中包含下面的代码:#include<vector>,在声明一个vector数组的同时也需要声明其保存元素的类型。如:vector<int> a;vector<char> b;


常用方法:

  • size():返回vector数组的大小。
  • resize():改变数组大小。
  • push_back():向数组尾部添加元素。
  • pop_back():删除最后一个元素(类似于队列)。

例:

 

简译:现有n个木块一字排开,编号从左到右为0至n-1。要求模拟一下4种操作(下面的a和b都是木块的编号)。

  •     move a onto b: 把a和b上方的木块全部移回原位,然后把a摞在b上面。
  •   move a over b: 把a上方的木块全部移回原位,然后把a放在b所在木块堆的顶部。
  •   pile a onto b: 把b上方的木块全部移回原位,然后把a及其上方的所有木块整体摞在b上面。
  •   pile a over b: 把a及上面的木块整体摞在b所在木块堆的顶部。
遇到quit时终止一组数据。a和b在同一堆时的指令是非法指令,应当忽略。所有操作结束后,输出每个位置的木块列表,按照从底部到顶部的顺序输出。

    输入:

       木块总数n

       指令1

       指令2

        ...

       quit

    输出:

      0: 木块编号 木块编号 ...

      1: 木块编号 木块编号 ...

     ...

      n: 木块编号 木块编号 ...

#include<iostream>
#include<string.h>
#include<vector>
#include<string>
using namespace std;

const int maxn=30;
int n;
vector<int> pile[maxn];


// 找木块a所在的堆和其所处高度,以引用的形式返回给调用者
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 b=pile[p][i];
		pile[b].push_back(b);  // 把木块b放回原位 
	}
	pile[p].resize(h+1);  // p堆中只保留下标0~h的木块 
} 


// 把第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);  // p堆中只保留0~h-1的木块 
} 


// 输出
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;      // pa:木块a所在的堆,ha:木块a在该堆中所处的位置 
		find_block(a,pa,ha);  // 查找木块a所在的堆,及在该堆中的位置
		find_block(b,pb,hb);
		if(pa==pb)  // a、b在同一堆中非法指令 
		    continue;
		if(s2=="onto")
		    clear_above(pb,hb);  // 把第pb堆中高度为ph的木块上方的所有木块移回原位
		if(s1=="move")
		    clear_above(pa,ha);
		pile_onto(pa,ha,pb);  //  把第pa堆高度为ha及其上方的木块整体移动到pb堆的顶部 
	} 
	print();  // 输出每堆的信息 
	return 0;
}

题目链接: The Blocks Problem - UVa 101

猜你喜欢

转载自blog.csdn.net/qq_33523482/article/details/79247262