poj1208 The Blocks Problem,模拟,vector

题意:

从左到右有n个积木,依次编号0~n-1,要求模拟以下4种操作。

1、move a onto b

a和b都是积木的编号,先将a和b上面所有的积木都放回原处,再将a放在b上。

2、move a over b

a和b都是积木的编号,先将a上面所有的积木放回原处,再将a放在b上。(b上原有积木不动)

3、pile a onto b

a和b都是积木的编号,将a和其上面所有的积极组成的一摞整体移动到b上。在移动前要先将b上面所有的积木都放回原处。移动的一摞积木要保持原来的顺序不变。

4、pile a over b

a和b都是积木的编号,将a和其上面所有的积极组成的一摞整体移动到b所在一摞积木的最上面一个积木上。移动的一摞积木要保持原来的顺序不变。

quit

结束操作

Sample Input

10

move 9 onto 1

move 8 over 1

move 7 over 1

move 6 over 1

pile 8 over 6

pile 8 over 5

move 2 over 1

move 4 over 9

quit

Sample Output

0: 0

1: 1 9 2 4

2:

3: 3

4:

5: 5 8 7 6

6:

7:

8:

9:

STL_vector操作:


v.front( )


返回对第一个元素的引用


v.back( )


返回对最后一个元素的引用


v.clear( )


清空vector


v.empty( )


如果为空,返回true,否则返回false


v.begin( )


返回指向第一个元素的迭代器(iterator)


v.end( )


返回指向最后一个元素的迭代器


v.pop_back( )


删除vector的最后一个元素


v.push_back(value)


将value放到vector的最后


v.size( )


返回vector中元素的个数


v.rbegin( )


返回指向末尾的逆向迭代器


v.rend( )


返回指向开头之前位置的逆向迭代器


v.swap(v1)


将v 和 v1交换


v.erase(loc)

v.erase(start,end)()中的均为iterator,删除后元素前移


删除loc所指元素,并返回下一元素迭代器

删除[start, end]元素,并返回最后被删除元素的下一个迭代器


v.insert(loc,value)

v.insert(loc,num,value)

v.insert(loc,start,end)


在loc位置插入一个value 并返回其迭代器

在loc位置插入num个value

在loc位置插入[start,end)间的元素插入后元素均后移


v.erase(unique(v.begin(),v.end()),  v.end());

v.erase(remove(v.begin(), v.end(), value),

v.end());

sort(v.begin(), v.end())//要加algorithm


对vector进行排重,

删除vector中值为value的元素

对vector进行从小到大排序,可加比较函数

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 25;
int n;
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 b = pile[p][i];
        pile[b].push_back(b); //把积木b放回原位
    }
    pile[p].resize(h+1);    //pile只应保留下标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);
}

//输出
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);
    }
    print();
    return 0;
}
时间: 2024-11-11 04:10:10

poj1208 The Blocks Problem,模拟,vector的相关文章

poj 1208 The Blocks Problem 模拟+vector的使用

模拟水题,直接贴代码,主要是vector的使用. //poj 1208 //sep9 #include <iostream> #include <vector> using namespace std; const int maxN=32; vector<int> v[maxN],tmp; char a[32],b[32]; int n,x,y,a1,a2,b1,b2; void get_address() { int i,j; for(i=0;i<n;++i)

UVA101 HDU1612 POJ1208 The Blocks Problem

问题链接:UVA101 HDU1612 POJ1208 The Blocks Problem. 这是一个模拟题,程序过程都是套路. 程序中用到了STL的容器类vector. 这个程序在UVA和POJ中都AC,可是在HDU中是"Presentation Error". AC通过的C++语言程序如下: /* UVA101 HDU1612 POJ1208 The Blocks Problem */ #include <iostream> #include <string&g

The Blocks Problem(vector)

题目链接:http://poj.org/problem?id=1208 The Blocks Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5004   Accepted: 2119 Description Many areas of Computer Science use simple, abstract domains for both analytical and empirical studie

PKU 1208 The Blocks Problem(模拟+list应用)

题目大意:原题链接 关键是正确理解题目意思 首先:介绍一下list容器的一些操作:参考链接 list<int> c1; c1.unique();              去重. c1.reverse();             反转链表. c1.insert(pos,num);   在pos位置插入元素num. c1.insert(pos,n,num);在pos位置插入n个元素num. c1.assign(n,num);     将n个num拷贝赋值给链表c. c1.sort();    

uva 101 The Blocks Problem (基本算法-模拟)

 The Blocks Problem  Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of planning and robotics (STRIPS) used a block world in which a robot arm performed

UVA - 101 The Blocks Problem(STL,模拟)

The Blocks Problem Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an e

uva 101 The Blocks Problem (模拟)

uva 101  The Blocks Problem Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of planning and robotics (STRIPS) used a block world in which a robot arm per

POJ 1208 The Blocks Problem

The Blocks Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5397   Accepted: 2312 Description Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AI study of

UVA101 The Blocks Problem

 The Blocks Problem  Background Many areas of Computer Science use simple, abstract domains for both analytical and empirical studies. For example, an early AIstudy of planning and robotics (STRIPS) used a block world in which arobot arm performed ta