uva 101 木块问题

Posted 努力的程序媛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 101 木块问题相关的知识,希望对你有一定的参考价值。

题目大意:

输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。

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的堆上。

当输入quit时,结束操作并输出0~n-1的位置上的木块情况

 

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来完成)

审题可发现move会将a上方的木块归位,onto会将b上方的木块归位

因此只需要判断move和onto将相应的归为操作完成后即可直接将(a及a以上的木块(b及b以上的木块)之上

#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 25;
void start_block(int n);
void show_block();
void found_block(int a, int& p, int& h);
void clear(int p, int h);
void move(int a, int ha, int b);
int n;
vector<int> pile[maxn];
int main()
{
    string s1, s2;
    int a, b;
    cin >> n;
    start_block(n);
    show_block();
    while (cin >> s1&&s1 != "quit"&&cin >> a >> s2 >> b)
    {
        int pa, pb, ha, hb;
        found_block(a, pa, ha);
        found_block(b, pb, hb);
        //if (s1 == "quit") break;
        if (pa == pb) continue;
        if (s1 == "move")clear(pa, ha);
        if (s1 == "onto")clear(pb, hb);
        move(pa, ha, pb);
    }
    show_block();
return 0; }
void start_block(int n)//初始化木块 { for (int i = 0; i < n; i++) { pile[i].push_back(i); } } void found_block(int a, int& p, int& h)//查找a木块的位置,以引用的形式返回调用者 { for (p = 0; p < n; p++) { for (h = 0; h < pile[p].size(); h++) if (pile[p][h] == a)return; } } void show_block() { for (int i = 0; i < n; i++) { cout << i << ":"; for (int j = 0; j < pile[i].size(); j++) { cout << " " << pile[i][j]; } cout << endl; } } void clear(int p, int h) //将第p堆h高度以上的木块归位 { for (int i = h + 1; i < pile[p].size(); i++) { int x = pile[p][i]; pile[x].push_back(x); } pile[p].resize(h + 1); } void move(int a, int ha, int b) //(a及a以上的木块(b及b以上的木块)之上 { for (int i = ha; i < pile[a].size(); i++) { pile[b].push_back(pile[a][i]); } pile[a].resize(ha); }

 问题:

这里第一次使用了cin当作while条件,以前一直用的是while(scanf)来判断的

scanf作为返回值是返回的是正确接收的个数,而cin并不是如此

cin当作while循环条件的详细测试将写在下一篇博客里

 

不定长数组:vector

头文件
#include<vector>
vector<int> vec;


迭代器:
vector<int>::iteratorite ite = vec.begin();

vec.push_back(1);尾部添加
vec.pop_back(1);尾部删除 (vs里增加已存在空间的一半) vec.reserve(
10);容量变大 vec.resize(3);重新设置有效原数个数 vec.empty(); vec.at(3);元素的引用 vec.back();最后一个元素 #include<algorithm> vec.insert(vec.begin()+2,12); 添加元素 vec.clear(); vec.assign((vec.begin(),vec.end()); vec.erase(vec.begin(),vec.end()); vec.assign(2,5); 迭代器失效
算法:
#include<algorithm>
遍历:
for_each(vec.begin(),vec.end(),函数);
排序:
sort(vec.begin(),vec.end());
#include<functional>
sort(str.begin(),str.end(),greater<int>());从大到小
乱序:
random_shuffle(vec.begin(),vec.end());

以上是关于uva 101 木块问题的主要内容,如果未能解决你的问题,请参考以下文章

UVA101 The Blocks Problem

E - The Blocks Problem ( UVA - 101)

luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks

uvaoj 101 - The Blocks Problem(vector应用+技巧)

uva437-The Tower of Babylon

STL:Vector 例题:UVA 101(积木问题) The Blocks Problem