题目大意:

输入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());

转载于:https://www.cnblogs.com/seamusopen/p/8447013.html

uva 101 木块问题相关推荐

  1. Uva 101 the block problem 木块问题(算法竞赛经典入门)STL vector

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

  2. the blocks problem(uva 101 or poj 1208)

    题目描述见:uva 101 or poj 1208 关键在于彻底理解题目中搬积木的几个命令的含义,见具体分析 如果还不能理解题意,那么找一个正确通过的代码,编译并输入测试数据,查看其每一个命令的执行情 ...

  3. 《算法竞赛入门经典》 例题5-2 木块问题(The Blocks Problem,UVa 101)

    原题及翻译 Many areas of Computer Science use simple, abstract domains for both analytical and empirical ...

  4. Uva 101:木块问题 The Blocks Problem(详细说明)+(难点)

    算法竞赛入门经典 开始接触ACM,老师推荐了紫皮书,但是C++渣渣的我读题都很费劲,搜罗博主文章发现几乎都是 原题+代码 .现尽己所能整理,比较啰(xiang)嗦(xi),希望能对同起步小白有所帮助, ...

  5. uva 101 The Blocks Problem

    1.     move a onto b在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最開始位罝) 2. move a over b在將a搬到b所在的那堆積木之上之前,先將a ...

  6. UVA - 101:The Blocks Problem

    原本以为是一道很简单的模拟题,结果写了一个小时...很长时间不碰算法题,的确手感差很多.不过我觉得随着刷题慢慢多起来应该会好的. 题目的意思也有点含糊,需要自己去猜,大概意思就是槽里有一堆木头,每个槽 ...

  7. 初学者acm的练习题指南

    上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1.    <!--[endif]-->Programming Bas ...

  8. ICPC训练联盟2021寒假冬令营(6)_2021.01.25_笔记

    文章目录 试题链接 学习笔记 - C++ STL 简介 STL容器实验 序列式容器 关联式容器 集合容器 A - The Blocks Problem (POJ 1208, UVA 101) 中文释义 ...

  9. WaWa的奇妙冒险(第二周集训自闭现场)

    第二周周记 (一)例题记录 A-简单计算器 (水题,栈的运用) HDU - 1237 Input Output Sample Input Sample Output 理解 AC代码 B-计算 (逆波兰 ...

最新文章

  1. 并查集+二分-hdu-4750-Count The Pairs
  2. 报告解读丨细数万亿企服市场发展史,行业发展新趋势
  3. OutOfMemoryException异常解析
  4. Python Cookbook 3rd Edition Documentation
  5. golang ide 升级
  6. php openssl des ecb,php7.2 des-ede3-ecb加密报错:openssl_encrypt():Unknown cipher algorithm 落叶随风博客...
  7. Android基础View回顾
  8. Redis 数据类型及应用场景
  9. servlet实现mvc
  10. EO CAT软件下载数据
  11. 面试必考:秒杀系统的9个核心知识点,一次性打包给你
  12. Oracle客户端安装配置crystal reports注意
  13. 主流数据库之MySQL函数和MySQL数据操作基础知识及示例
  14. 什么是 Office Open XML 文件格式
  15. LeCo-238. 除自身以外数组的乘积
  16. try/catch 的解释与用法
  17. unable to resolve superclass of 解决方法
  18. 基带信号与频带信号的基础认识
  19. k折交叉验证(k-fold Cross-validation)
  20. POI 读写EXCEL日期类型单元格

热门文章

  1. xml c libxml类库使用
  2. 如何正确的对待设计模式——我的观点
  3. 金属表面划痕检测Halcon
  4. 计算机前端专业术语,学习计算机知识必须懂得50个专业术语
  5. cef在android中使用_嵌入Chrome cef之完整版(本教程基于cef1)
  6. java vector内存结构_Java 数据结构
  7. python制作二级菜单_python实现二级登陆菜单及安装过程
  8. 七、DNS报文及抓包分析
  9. spring单元测试无法注入bean_2019年,最新的Spring 面试108题 “ 系列 ”,附带答案.........
  10. 随行付微服务测试之静态代码扫描