第2章 队列(C++版)解析.ppt

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 队列 【例2-5】最少步数 【问题描述】 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100*100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。 【输入样例】   12 16 18 10 【输出样例】   8 9 【算法分析】 由于A、B两点是随机输入的,因此无法找到计算最少步数的数学规律,只能通过广度优先搜索的办法求解。 2、奇怪的电梯(lift.cpp) 【问题描述】 大楼的每一层楼都可以停电梯,而且第i层楼(1=i=N)上有一个数字Ki(0=Ki=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢? 【输入格式】lift.in 输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。 【输出格式】lift.out 输出文件仅一行,即最少按键次数,若无法到达,则输出-1。 【输入样例】 5 1 5 3 3 1 2 5 【输出样例】 3 3、产生数(Produce.cpp) 【问题描述】 给出一个整数n(n=2000)和k个变换规则(k≤15)。规则: ① 1个数字可以变换成另1个数字; ② 规则中,右边的数字不能为零。 例如:n=234,k=2规则为 2 → 5 3 → 6 上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。 求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。 【输入格式】Produce.in n k x1 y1 x2 y2 … … xn yn 【输出格式】Produce.out 格式为一个整数(满足条件的整数个数)。 【输入样例】 234 2 2 5 3 6 【输出样例】 4 4、家庭问题 【问题描述】 有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。 当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人? 例如:n=6,k=3,三个关系为(1,2),(1,3),(4,5) 此时,6个人组成三个家庭,即:{1,2,3}为一个家庭,{4,5}为一个家庭,{6}单独为一个家庭,第一个家庭的人数为最多。 【输入格式】 文件的第一行为n,k二个整数(1≤n≤100)(用空格分隔) 接下来的k行,每行二个整数(用空格分隔)表示关系 【输出格式】 二个整数(分别表示家庭个数和最大家庭人数) 【输入样例】 6 3 1 2 1 3 4 5 【输出样例】 3 3 * * 队列是限定在一端进行插入,另一端进行删除特殊线性表。就像排队买东西,排在前面的人买完东西后离开队伍(删除),而后来的人总是排在队伍未尾(插入)。通常把队列的删除和插入分别称为出队和入队。允许出队的一端称为队头,允许入队的一端称为队尾。所有需要进队的数据项,只能从队尾进入,队列中的数据项只能从队头离去。由于总是先入队的元素先出队(先排队的人先买完东西),这种表也称为先进先出(FIFO)表。 队列可以用数组Q[m+1]来存储,数组的上界m即是队列所容许的最大容量。在队列的运算中需设两个指针: head:队头指针,指向实际队头元素的前一个位置 tail:队尾指针,指向实际队尾元素所在的位置 一般情况下,两个指针的初值设为0,这时队列为空,没有元素。图1 (a)画出了一个由6个元素构成的队列,数组定义Q[11]。 Q[i] i=3,4,5,6,7,8 头指针head=2,尾指针tail=8。 队列中拥有的元素个数为:L=tail-head现要让排头的元素出队,则需将头指针加1。即head=head+1这时头指针向上移动一个位置,指向Q[3],表示Q[3]已出队。见图1 (b)。

文档评论(0)

4477704 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档