(STL,vector)木块问题

题目:

输入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:

分析与解答:

1.提取指令之间的共同点,编写函数以减少代码量
经观察:
pile a onto b和move a onto b,在移动之前,都需要把b上方木块归位。
move a onto b和move a over b,在移动之前,都需要把a上方木块归位。
两个都是一个意思,把第p堆高度位h的木块上方的所有木块移回原位
四条指令在做完预备工作(归位)之后,都是把a这个堆高度位h及上方的木块整体移到b这个堆整体的顶部

有人要问为什么需要有h
如果
2:2 3 4 5
6:6 7 8 9

pile 3 over 6

2:2
6:6 7 8 9 3 4 5
懂了吧,并不是只有从最底部开始移动
2.利用vector
vector< int>pile[maxn]像是一个二维数组,只不过一维大小固定二位不固定
vector< int>a
a.size()读取大小
a.resize(b)改变大小(只保留前b个数,下标0到b-1的元素)
a.push_back(b)向尾部添加元素b
a.pop_back()删除最后一个元素
本题每个木块堆的高度不确定,而木块堆的个数确定有n个,因此用vector合适

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
const int maxn = 30;
int n;
vector<int> pile[maxn];//找到木块a所在的pile和height,以引用的形式返回调用者void find_block(int a,int&p,int &h){//p和h是需要通过这个函数求的,由于是引用,所以return后p,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 m=pile[p][i];pile[m].push_back(m);}pile[p].resize(h+1);
} 
//把第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 ,s1!="quit"){   cin>> 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地图自定义图标_如何在H5里添加地图导航?这份教程请收藏!

智能手机的出现为我们的生活带来了翻天覆地的改变&#xff0c;比如说衣食住行都有了显著的变化。外卖让就餐更加方便、手机支付也让生活更加便利&#xff0c;地图导航功能更是让大家从此不再迷路&#xff0c;有了手机以后&#xff0c;大家都开始习惯直接用手机搜索目的地&#…

(STL,set)安迪的第一个字典

问题&#xff1a; 输入一个文本&#xff0c;找出所有不同的单词&#xff08;连续的字母序列&#xff09;&#xff0c;按字典序从小到大输出。单词不区分大小写。 样例输入 Adventures in Disneyland Two blondes were going to Disneyland when they came to a fork in the…

ios 高德获取定位_解决ios11不支持高德地图API定位功能的方法

在 iOS 11 系统上访问JS API定位业务失败怎么解决&#xff1f;苹果新发的 iOS 11 操作系统的一大特性是对 http 形式访问页面的限制变得非常严格(相比iOS 10 和 iOS 9)。高德提供的JS API功能均支持http和https两种协议访问&#xff0c;在iOS 11操作系统上推荐使用https形式访问…

(STL,map)反片语

题目 输入一些单词&#xff0c;找出所有满足如下条件的单词&#xff1a;该单词不能通过字母重排&#xff0c;得到输入文本中的另外一个单词。在判断是否满足条件时&#xff0c;不区分大小写&#xff0c;但输出保留输入中的大小写&#xff0c;按字典序进行排列&#xff08;所有…

源码 状态机_LLVM学习笔记(1)--初探源码

一直耳闻LLVM相比于GCC&#xff1a;well documented架构灵活&#xff0c;前后端解耦符合龙书的讲解昨天读到了一篇虽然概括却很周到的llvm入门导引陈钦霖&#xff1a;LLVM Pass入门导引​zhuanlan.zhihu.com就沿着其中的提示探索了下LLVM源码&#xff0c;倒也没有想要成为专业的…

n个数的最小公倍数

文章目录1.利用公式法求两个数最小公倍数2.最大公约数求法3.求几个数的最小公倍数4.例题1.利用公式法求两个数最小公倍数 假设现在要求最小公倍数的两个数为x,y&#xff0c;他们的最大公约数为p,最小公倍数为q。则xypq 2.最大公约数求法 int gg(int a,int b){int c;while(b)…

cv mat的shape_将ndarray转换为cv::Mat的最简单方法是什么?

正如kyamagu建议的那样&#xff0c;您可以使用OpenCV的官方python包装器代码&#xff0c;尤其是pyopencv_to和{}。在我一直在为所有依赖项和生成的头文件而挣扎。然而&#xff0c;可以通过将^{}作为lightalchemist did here进行“清理”来降低复杂性&#xff0c;以便只保留必要…

c语言年月日问题思路总结 闰年非闰年每个月份的天数 解决今天是妹子出生的第多少天的问题

1.闰年非闰年每个月份的天数&#xff1a; int year[2][13]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };经观察发现&#xff1a; a。2月闰年有29天&#xff0c;非闰年28天 b。1、3、5、7、8、10、12月份&#xf…

aop判断方法是否执行成功_判断图中是否有环的三种方法

0、什么是环&#xff1f;在图论中&#xff0c;环&#xff08;英语&#xff1a;cycle&#xff09;是一条只有第一个和最后一个顶点重复的非空路径。在有向图中&#xff0c;一个结点经过两种路线到达另一个结点&#xff0c;未必形成环。1、拓扑排序1.1、无向图使用拓扑排序可以判…

reverse()函数反转字符串以及任意类型数组

文章目录reverse用法1.reverse函数反转string2.reverse函数反转字符数组2.自定义reverse函数反转任意类型数组例子&#xff1a;reverse用法 1.reverse函数反转string #include <iostream> #include <algorithm> #include <string> using namespace std;int…

sap运维要做哪些工作_患上腰椎间盘突出,适合做哪些工作?不适合做哪些工作?...

腰椎间盘突出的患者&#xff0c;大多数是年轻人。年轻人生活和工作压力比较大&#xff0c;大多数人都不可能因为腰椎病完全停止工作&#xff0c;事实上也不用完全停止工作&#xff0c;我们更多地应该虑如何平衡养病和工作之间的关系&#xff0c;那我们今天就来和大家讲讲&#…

(STL,map,queue)团体队列

目录 目录题目&#xff1a;分析与解答1.队列先进先出&#xff0c;正好符合排队问题&#xff0c;所以用队列模拟2.每一个团队有一个队列&#xff0c;团队整体又形成一个队列3.每一个团队的成员和团队编号需要对应&#xff0c;因此利用map存编号为x的人所在的团队编号4.插入队&am…

bat执行exe程序_dos命令start教程,并行运行exe程序或者启动bat批处理cmd脚本

大家好&#xff0c;我是老盖&#xff0c;首先感谢观看本文&#xff0c;本篇文章做的有视频&#xff0c;视频讲述的比较详细&#xff0c;也可以看我发布的视频。今天我们学习DOS命令start这个命令&#xff0c;它可以启动一个EXE程序&#xff0c;也可以启动一个BAT批处理脚本&…

(STL,set,priority_queue)丑数

题目&#xff1a; 丑数是指不能被2,3,5以外的其他素数整除的数。把丑数从小到大排列起来&#xff0c;结果如下&#xff1a;1,2,3,4,5,6,8,9,10,12,…求第1500个丑数 分析与解答&#xff1a; 0.对于任意丑数x&#xff1a;2x&#xff0c;3x&#xff0c;5x也是丑数 1.用优先队…

数据库备份mysql_MySQL数据库备份与恢复方法

常有新手问我该怎么备份数据库&#xff0c;下面介绍3种备份数据库的方法&#xff1a;(1)备份数据库文件MySQL中的每一个数据库和数据表分别对应文件系统中的目录和其下的文件。在Linux下数据库文件的存放目录一般为/var/lib/mysql。在Windows下这个目录视MySQL的安装路径而定&a…

(大整数类Biginteger)大斐波数

题目 Fibonacci数列&#xff0c;定义如下&#xff1a; f(1)f(2)1 f(n)f(n-1)f(n-2) n>3。 计算第n项Fibonacci数值。 输入 输入第一行为一个整数N&#xff0c;接下来N行为整数Pi&#xff08;1<Pi<1000&#xff09;。 输出 输出为N行&#xff0c;每行为对应的…

mysql创建表的流程_MySQL Create Table怎样创建表?详解创建过程步骤

1、新建一个名为"createsql"的数据库。2、点击该数据库左侧的三角形图标&#xff0c;并显示其下面有四个列表项&#xff1a;表(Tables)和视图(Views)、存储过程(Stored Procedures)、函数(Functions)。3、右击【表(Tables)】列表项&#xff0c;并在弹出的快捷菜单中选…

(stack栈)rails

题目&#xff1a; 某城市有一个火车站&#xff0c;铁轨铺设如图所示&#xff0c;有n节车厢从A方向驶入车站&#xff0c;按进站顺序编号为1至n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢&#xff0c;你可以借助中转站C。这是一个…

docker 查看镜像_Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指!...

来自小洋人最HAPPY投稿一、Docker简介Docker是开源应用容器引擎&#xff0c;轻量级容器技术。基于Go语言&#xff0c;并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux系统上&#xff0c…

(stack 解析表达式)矩阵链乘

问题: 输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果无法进行,输出error.如果A是m*n矩阵,B是n*p的矩阵,乘法次数为m*n*p 如果A的列数不等于B的行数,则乘法无法进行. A 50*10 B 10*20 C 20*5 &#xff08;A(BC))乘法次数&#xff1a;10*20*5(BC乘法次数)50*1…