题解 The Blocks Problem(UVa101)紫书P110vector的应用
紫书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");}
}
要点与细节总结:
- 刘汝佳老师在计算a块与b块所在的h与p时,采用了引用传值的方法,一个函数同时计算了两个局部变量:
void find_block(int num,int& h,int& p)
- 数据结构的选择vector数组,题目中使用到的函数有
v.size();
v.resize();
v.push_back();
- 提取四个指令的共同点,设计出两个函数减少重复代码。
更新于2020.6.22
题解 The Blocks Problem(UVa101)紫书P110vector的应用相关推荐
- UVa101 - The Blocks Problem
//UVa101 - The Blocks Problem #include<iostream> #include<cstdio> #include<string> ...
- [紫书CH0] 《算法竞赛入门经典》(第2版) 题解目录
紫书题解 本着仅仅门外看看风景的初心,却 不慎 被其内壮丽美景所深深吸引.将会持续的画上一段时间对紫书进行系统性的学习,相关的 UVa 经典习题会道道完成并贴出题解供大家学习交流.也算是记录我曾经来过 ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- (紫书,感谢作者)第7章暴力求解法
今天,我们谈一谈紫书上面的内容--暴力求解法 对于一道问题来说,我们是可以借助计算机运算快的特点,将所有可能的情况全部(不一定是全部)列出来,然后去寻找我们想要的答案,这就是暴力求解了,但暴力求解绝对 ...
- UVa 11062 Andy's Second Dictionary(刘汝佳紫书升级题)
在介绍这道题之前,先介绍一下紫书里面和这道题很像的一道题: 紫书P112页 的例题5-3 安迪的第一个字典(Andy's First Dictionary UVa 10815) 原题链接如下: And ...
- c语言 开灯问题,刘汝佳紫书[数组和字符串]内容总结
本篇文章是笔者对紫书第3章--数组和字符串内容的一个整理,主要是基于问题的整理,总结并理顺了一下思路. 不得不说,这些题解真的是太巧妙了
- UVa 1339,紫书P73,词频
题目链接:https://uva.onlinejudge.org/external/13/1339.pdf 紫书P73 解题报告: #include <stdio.h> #include ...
- 11行代码AC——比紫书优化,例题2-3 近似计算——解题报告
励志用更少的代码做高效的表达 题意: 计算π/4 = 1 - 1/3 + 1/5 - 1/7 + -,直到最后一项小于10^-6. 思路分析: 本题很简单,因此计算重心从解题转化为优化. 本题为重复计 ...
- 比紫书优化,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个丑数是什么. 没有输入 输 ...
最新文章
- 猫脸关键点检测大赛:三种方法,轻松实现猫脸识别!
- c++版a+b问题的各种无聊做法
- 20应用统计考研复试要点(part26)--简答题
- Nginx服务学习(6)-日志模块
- Hadoop问题:The auxService:mapreduce_shuffle does not exist
- linux 大量文件 ls卡死,Linux下文件过多导致 ls 命令出现 arguments too long 的问题
- 安装虚拟机时遇到的问题
- How to convert hair particles to mesh in Blender
- IDEA 2020.3 更新了,机器学习都整上了
- 定制一款铝合金型材的流程
- ssh 远程连接详解--(linux运维09)
- 遗传算法在组卷中的应用
- WORD出错:设置为稿纸后,右键的字体、段落项目变灰
- Aruba AC如何通过CLI备份及导入导出
- 每个Java初学者都应该搞懂的六个问题
- android自动划屏实现,OSC首发:android中的左右滑屏实现By ViewPager
- CentOS8 编译安装tsar nagios + nagios-plugins + nsca
- 操盘建议----全球顶尖交易员的成功实践和心路历程(三)
- 斑斑驳驳。伤情时节,镌为别离的箫瑟
- python multiprocessing_Python的multiprocessing模块详解
热门文章
- 浅谈一下:运营网站的一些经历和故事
- css渲染图片时放大或缩小图片变模糊处理方式
- 从零学习VINS-Mono/Fusion源代码(五):VIO初始化
- Structured-Streaming编程练习知识点
- 唐山初中计算机考试知识点,2019河北唐山教资笔试知识点:教育学人物知识梳理...
- 苹果桌面主题_iOS 14自定义“桌面主题” ,果粉们都玩疯了~【附教程】
- 职高计算机工作总结范文,职高学习工作总结范文2000字
- DC-5靶机渗透测试详细教程
- substance的使用示例(转)
- MVC之Identity身份验证