紫书P110;vector的应用;UVa101 The Blocks Problem

Vjudge题目地址请移步此处

题目大意:

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

  • 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时,结束操作并输出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:

题目分析(思路依据紫书):

数据结构选择:每个单元格内block的数目是动态的,固可以采用vector模拟一个单元格,而单元格总共有n个,n值确定,所以可以开一个每个单元都是vector的数组:vector<int> pile[26]

算法设计:题目涉及整段数据与单个数据的移动,且n最大只有25,固采用模拟的方法时间复杂度完全够用。
而模拟的过程涉及两个步骤:<1. 复原block <2. 移动block;
分析题目中四条指令:
move需要将a上方block全部复原,单独移动a;
pile不需要将复原a上方block,需要整段移动;
onto需要将b上方block全部复原,要求a与b相邻;
over不需要复原b上方block,再移动a或者整段。
分析四条指令的异同点且结合先复原后移动的顺序,刘汝佳老师巧妙地进行了以下处理(个别地方与原代码不同):

//pa和pb为a和b的数组下标,ha和hb为a和b的vector下标
if(order1=="move") clear_above(pa,ha);//将pa,ha位置上方的block复原
if(order2=="onto") clera_above(pb,hb);//将pb,hb位置上方的block复原
pile_onto(pa,ha,pb);//将pa,ha位置及其上方的block移动至pb顶端

模块设计:至此,程序的基本框架为:预处理–输入与初始化–模拟–输出–return 0;

代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
using namespace std;int n,a,b;
string order1,order2;
vector<int> pile[26];void find_block(int num,int& h,int& p);
void clear_above(int h,int p);
void pile_onto(int p1,int h1,int p2);
void print();int main()
{//读入与初始化 scanf("%d",&n);for(int i=0;i<n;i++) pile[i].push_back(i);//模拟 while(cin>>order1>>a>>order2>>b){int ha,hb,pa,pb;find_block(a,ha,pa);find_block(b,hb,pb);if(pa==pb) continue;if(order1=="move") clear_above(ha,pa);if(order2=="onto") clear_above(hb,pb);pile_onto(pa,ha,pb);//print();}//输出print();return 0;
}void find_block(int num,int& h,int& p)
{for(p=0;p<n;p++)for(h=0;h<pile[p].size();h++)if(pile[p][h]==num) return ;
}void clear_above(int h,int p)
{for(int i=h+1;i<pile[p].size();i++)pile[pile[p][i]].push_back(pile[p][i]);pile[p].resize(h+1);return ;
}void pile_onto(int p1,int h1,int p2)
{for(int i=h1;i<pile[p1].size();i++)pile[p2].push_back(pile[p1][i]);pile[p1].resize(h1);return ;
}void print()
{for(int i1=0;i1<n;i1++){printf("%d:",i1);for(int i2=0;i2<pile[i1].size();i2++) printf(" %d",pile[i1][i2]);printf("\n");}
}

要点与细节总结:

  1. 刘汝佳老师在计算a块与b块所在的h与p时,采用了引用传值的方法,一个函数同时计算了两个局部变量:
void find_block(int num,int& h,int& p)
  1. 数据结构的选择vector数组,题目中使用到的函数有v.size(); v.resize(); v.push_back();
  2. 提取四个指令的共同点,设计出两个函数减少重复代码。
更新于2020.6.22

题解 The Blocks Problem(UVa101)紫书P110vector的应用相关推荐

  1. UVa101 - The Blocks Problem

    //UVa101 - The Blocks Problem #include<iostream> #include<cstdio> #include<string> ...

  2. [紫书CH0] 《算法竞赛入门经典》(第2版) 题解目录

    紫书题解 本着仅仅门外看看风景的初心,却 不慎 被其内壮丽美景所深深吸引.将会持续的画上一段时间对紫书进行系统性的学习,相关的 UVa 经典习题会道道完成并贴出题解供大家学习交流.也算是记录我曾经来过 ...

  3. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  4. (紫书,感谢作者)第7章暴力求解法

    今天,我们谈一谈紫书上面的内容--暴力求解法 对于一道问题来说,我们是可以借助计算机运算快的特点,将所有可能的情况全部(不一定是全部)列出来,然后去寻找我们想要的答案,这就是暴力求解了,但暴力求解绝对 ...

  5. UVa 11062 Andy's Second Dictionary(刘汝佳紫书升级题)

    在介绍这道题之前,先介绍一下紫书里面和这道题很像的一道题: 紫书P112页 的例题5-3 安迪的第一个字典(Andy's First Dictionary UVa 10815) 原题链接如下: And ...

  6. c语言 开灯问题,刘汝佳紫书[数组和字符串]内容总结

    本篇文章是笔者对紫书第3章--数组和字符串内容的一个整理,主要是基于问题的整理,总结并理顺了一下思路. 不得不说,这些题解真的是太巧妙了

  7. UVa 1339,紫书P73,词频

    题目链接:https://uva.onlinejudge.org/external/13/1339.pdf 紫书P73 解题报告: #include <stdio.h> #include ...

  8. 11行代码AC——比紫书优化,例题2-3 近似计算——解题报告

    励志用更少的代码做高效的表达 题意: 计算π/4 = 1 - 1/3 + 1/5 - 1/7 + -,直到最后一项小于10^-6. 思路分析: 本题很简单,因此计算重心从解题转化为优化. 本题为重复计 ...

  9. 比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告

    题意: 丑数是一些因子只有2,3,5的数.数列1,2,3,4,5,6,8,9,10,12,15--写出了从小到大的前11个丑数,1属于丑数.现在请你编写程序,找出第1500个丑数是什么. 没有输入 输 ...

最新文章

  1. 猫脸关键点检测大赛:三种方法,轻松实现猫脸识别!
  2. c++版a+b问题的各种无聊做法
  3. 20应用统计考研复试要点(part26)--简答题
  4. Nginx服务学习(6)-日志模块
  5. Hadoop问题:The auxService:mapreduce_shuffle does not exist
  6. linux 大量文件 ls卡死,Linux下文件过多导致 ls 命令出现 arguments too long 的问题
  7. 安装虚拟机时遇到的问题
  8. How to convert hair particles to mesh in Blender
  9. IDEA 2020.3 更新了,机器学习都整上了
  10. 定制一款铝合金型材的流程
  11. ssh 远程连接详解--(linux运维09)
  12. 遗传算法在组卷中的应用
  13. WORD出错:设置为稿纸后,右键的字体、段落项目变灰
  14. Aruba AC如何通过CLI备份及导入导出
  15. 每个Java初学者都应该搞懂的六个问题
  16. android自动划屏实现,OSC首发:android中的左右滑屏实现By ViewPager
  17. CentOS8 编译安装tsar nagios + nagios-plugins + nsca
  18. 操盘建议----全球顶尖交易员的成功实践和心路历程(三)
  19. 斑斑驳驳。伤情时节,镌为别离的箫瑟
  20. python multiprocessing_Python的multiprocessing模块详解

热门文章

  1. 浅谈一下:运营网站的一些经历和故事
  2. css渲染图片时放大或缩小图片变模糊处理方式
  3. 从零学习VINS-Mono/Fusion源代码(五):VIO初始化
  4. Structured-Streaming编程练习知识点
  5. 唐山初中计算机考试知识点,2019河北唐山教资笔试知识点:教育学人物知识梳理...
  6. 苹果桌面主题_iOS 14自定义“桌面主题” ,果粉们都玩疯了~【附教程】
  7. 职高计算机工作总结范文,职高学习工作总结范文2000字
  8. DC-5靶机渗透测试详细教程
  9. substance的使用示例(转)
  10. MVC之Identity身份验证