不定长数组:vector

vector就是一个不定长数组。不仅如此,它把一些常用操作“封装”在了vector类型内部。 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resize( )改变大小,a.push_back( )向 尾部添加元素,a.pop_back( )删除最后一个元素。

vector是一个模板类,所以需要用vectora或者vectorb这样的方式来声明一 个vector。Vector是一个类似于inta[]的整数数组,而vector就是一个类似于 stringa[ ]的字符串数组。vector看上去像是“一等公民”,因为它们可以直接赋值,还可以作为 函数的参数或者返回值,而无须像传递数组那样另外用一个变量指定元素个数。(n=strlen(a);)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

木块问题(The Blocks Problem,Uva 101)

从左到右有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和a上面所有的木块整体放到b上面
  • pile a over b: 把a和a上面所有的木块整体放在b所在木块堆的最上方

一组数据的结束标志为"quit",如果有非法指令(a和b在同一堆),应当忽略。

输出:所有操作输入完毕后,从左到右,从下到上输出每个位置的木块编号。

#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
int n;
vector<int> pile[];
void find_block(int x,int &xp,int &j){
for(int i=;i<n;i++){
for(j=;j<pile[i].size();j++){
if(pile[i][j]==x) {
xp=i;
return;
}
}
}
}
//把第p堆高度为h的木块上方的所有木块移回原位
void clear_above(int p,int h){
for(int i=h+;i<pile[p].size();i++){
int x=pile[p][i];
pile[x].push_back(x);
}
pile[p].resize(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);
}
//print
void print(){
for(int i=;i<n;i++){
printf("%d:",i);
for(int j=;j<pile[i].size();j++) printf(" %d",pile[i][j]);
printf("\n");
}
}
int main(){
int a,b;
string s1,s2;
cin>>n;
for(int i=;i<n;i++) pile[i].push_back(i);
while(){
cin>>s1;
if(!s1.compare("quit")) break;
cin>>a>>s2>>b;
int pa,pb,ha,hb;
find_block(a,pa,ha);
find_block(b,pb,hb);
if(pa==pb) continue;//在同一堆,忽略
if(!s2.compare("onto")) clear_above(pb,hb);
if(!s1.compare("move")) clear_above(pa,ha);
pile_onto(pa,ha,pb);
}
print();
return ;
}

数据结构的核心是vectorpile[maxn],所有操作都是围绕它进行的。vector就像一个 二维数组,只是第一维的大小是固定的(不超过maxn),但第二维的大小不固定。上述代码 还有一个值得学习的技巧:输入一共有4种指令,但如果完全独立地处理各指令,代码就会 变得冗长而且易错。更好的方法是提取出指令之间的共同点,编写函数以减少重复代码。

vector头文件中的vector是一个不定长数组,可以用clear( )清空,resize( ) 改变大小,用push_back( )和pop_back( )在尾部添加和删除元素,用empty( )测试是否为 空。vector之间可以直接赋值或者作为函数的返回值,像是“一等公民”一样。

木块问题(The Blocks Problem,Uva 101)的更多相关文章

  1. The Blocks Problem UVA - 101

      Many areas of Computer Science use simple, abstract domains for both analytical and empirical stud ...

  2. UVa 101 The Blocks Problem Vector基本操作

    UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...

  3. UVa 101 - The Blocks Problem(积木问题,指令操作)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  4. 【UVA - 101】The Blocks Problem(vector+模拟)

    The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...

  5. Uva 101 -- the block problem

    Uva 101 the block problem 题目大意: 输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置.现对这些木块进行操作,操作分为四种. 1.move a o ...

  6. POJ 1208 The Blocks Problem

    The Blocks Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5397   Accepted: 231 ...

  7. The Blocks Problem(vector)

    题目链接:http://poj.org/problem?id=1208 The Blocks Problem Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  8. UVa101 The Blocks Problem(不定长数组vector)

    The Blocks Problem 书上的一道例题,代码思路比较清晰,可以看懂. 相关知识: 若a是一个vector,则: a.size():读取它的大小 a.resize():改变大小 a.pus ...

  9. uva 101 POJ 1208 The Blocks Problem 木块问题 vector模拟

    挺水的模拟题,刚开始题目看错了,poj竟然过了...无奈.uva果断wa了 搞清题目意思后改了一下,过了uva. 题目要求模拟木块移动: 有n(0<n<25)快block,有5种操作: m ...

随机推荐

  1. java连接Oracle案例

    首先来讲一下桥连接: 首先配置数据源:打开控制面板——管理工具——数据源(ODBC)——用户DSN——添加——找到Oracle驱动程序. //JDBC-ODBC桥连接public class Conn ...

  2. bzoj4873

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 最大权闭合子图... 建图: 1.d[i][j]:i->j区间的费用,d[i][j] & ...

  3. uva10655

    Given the value of a+b and ab you will have to find the value of a n + b n Input The input file cont ...

  4. libnids 显示UDP数据报,编译,运行,正确。

    #include<stdio.h>#include<nids.h>#include<string.h>#include <sys/socket.h>#i ...

  5. Android 属性系统 Property service 设定分析 (转载)

    转自:http://blog.csdn.net/andyhuabing/article/details/7381879 Android 属性系统 Property service 设定分析 在Wind ...

  6. E20171228-hm

    traverse  n. 穿过; 横贯,横切; 横木; [建] 横梁;               vt. 通过; 横越,横贯; [法] 否认,反驳; [木工] 横刨;

  7. 运行Android Studio总是未发现设备

    1.未发现虚拟机设备

  8. wamp集成环境下帝国备份出错

    我在本地wamp环境下面使用帝国备份王时,报错信息如下: Parse error: syntaxerror, unexpected $end in D:wampwwwhuifuclassfunctio ...

  9. Unity项目 - Boids集群模拟算法

    1987年Craig W.Reynolds发表一篇名为<鸟群.牧群.鱼群:分布式行为模式>的论文,描述了一种非常简单的.以面向对象思维模拟群体类行为的方法,称之为 Boids ,Boids ...

  10. MVC学习-发送请求

    在HomeControl中添加一个Action,代码如下: public ActionResult Add() { return View(); } 当View()中不写任何参数时,默认会调用同名的视 ...