经典算法例题分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
根据分析图,可以推到出循环赛问题的流程分析图, 如图所示。
开始 创建一个二维数组
将选手两两进行比赛
判断该选手是否以比赛过 否 否
是
另一个选手
人数是否超出 是 比赛结束
现有n´m个格子的棋盘,马在棋盘上行走,只能走 日字。编写程序,求出马从任意位置出发,将所有 格子走完并且只能走过一次的所有路径。
是
否
走下一个格子
否
是否以走到最后
是
结束
在本章中重点讲解了经典的C语言例题,其中包括 八皇后、汉诺塔、马遍历、循环赛等问题。这些都 对以后学习C语言有很大的帮助。大家应该熟练掌 握其中的解题方法。
求出的最小公倍数看是否能整除这三个数。若能整 除这三个数,则输出其中的最小的数,就是公倍数。 根据题意,看一下此问题的具体分析,如图16.8所 示
求3 6 9的最小给倍数: 选出3个数中的最大数:9 用选出的最大数乘以1:9×1=9 用乘得的数除以这三个数:9÷3=3 9÷6有余数,所以不是最小公倍数 用选出的最大数乘以2:9×1=18
现有八个皇后,它们不能放在同一行、同一列、同 一对角线上。我们首先手工摆放,尝试从中找到规 律,如图16.1所示,图中使用圆形表示皇后。当一 个皇后放置后,该皇后所在的行、列、对角线上的 位置都标成灰色。这些位置都不能再摆放其他皇后。
根据问题分析,可以推导出八皇后的算法设计流程 图,如图所示。
在遇到循环赛问题时,我们可以将队员的人数分成 两半,即8个选手的比赛日程由4个选手的比赛日程 决定。用这种一分为二的方法对选手进行划分直至 只剩下两个对手为止,单独设置其比赛日程,然后 将这些单独的块最后合并起来即为最终的解。根据 题意,看一下此题的分析图。如图所示。
1
2
3
4
5
6
7
8
先将8个人两组,进行比赛
1 2 3
2 3
1
A
B
C
A
B
C
3
2
1
3
1 2
A
B
C
A
B
C
1 2
3
1 2
3
A
B
C
A
B
C
1
2
3
1
2 3
A
B
C
A
B
C
1 2 3
A
B
C
根据问题分析,可以推导出汉洛塔的算法设计流程 图。
开始
根据题意先建立 一个移动的 hanruo()函数 递归调用 移动最后一个 盘子到C柱子上
结束
现有17个猴子,这些猴子根据一个游戏选举大王。 其游戏规则为17个猴子站成一圈,然后从1到3开始 计数,数到3的猴子淘汰退出游戏,下一个猴子继 续从1开始数,直到最后只剩一个猴子,即为大王。
用乘得的数除以这三个数:18÷3=6 18÷6=3,18÷9=2,所以18是最 小公倍数
根据问题分析,可以推导出三个数的最小公倍数的 流程图,如图16.9所示。
开始 找出三个数的最大值
最大值乘以1 最大值一次乘以下一 个自然数 用乘得的数取出这 三个数
否 这三个数是否被整除
是 这个数是最小公倍 数
1 1 3 2 2 1
1 3 4 2 3 4
1 5 2 3 4
1 5
6
2
1 3 4 5
6 7 2
8 3 4
1 5
6 7 2
8 3 4
1 5 9
6 7 2
根据分析图,可以推到出魔术方正的流程图,如图 所示。
开始 将1放到一行的中间
下一个数填入右1、 上1的单元格 重新填写上一个数 填数单元格是否有数 是
假设迷宫是由许多格子组成的矩形,其中用1表示 有墙,0表示有路。走迷宫即为沿上、下、左、右 方向走,直到最后走出迷宫。根据题意,看一下此 问题的分析图,如图所示。
根据分析图,可以推到出迷宫的流程图,如图16.26 所示。
开始 创建一个数组
开始走第一个格子
返回上一个格子,从 新走出口
是否有障碍
9 10 11 12 13 14 15 16 9 10 12 13 14 15 16 1 2 9 10 12 13 15 16
1 2 3 10 12 15 16
6 10 12 16 10 15
根据问题分析,可以推导出猴子选王算法设计流程 图,如图16.6所示。
开始 将猴子编号,放入一个数组中 第一只猴子数开始从1 数
否 否 单元格是否以满
是
结束
假设有一条绳子,上面有红、白、蓝3中颜色的多 面旗子,这些旗子的排列是没有顺序的,要求用最 少的步骤将绳子上的旗子按蓝、白、红3种颜色排 列。要求只能在绳子上进行旗子的移动,并且每次 只能调换两个旗子。
假设从绳子的一端开始进行,遇到蓝色的旗子向前 移,遇到白色的旗子就留在中间,遇到红色的旗子 就往后移,根据题意,看一下此题的分析图,如图 所示。
开始
现有9件商品,从中选出3件使得其重量之和与600 克之间差值最小,其中每件商品的重量由键盘输入。
假设9件商品的重量分别为88、90、40、100、60、 50、55、99、66,我们对这些商品进行分析,如图 16.11所示。我们可以选择其中重量最重的三件商品, 看一看重量是否超过600克,如果超过选择次其中 的商品。
棋盘总共有n行和m列,马的位置是任意的,马从某 点走日字走完所有格子并且只能走的一次,根据题 意,看一下此题的分析图所示
马行走的方式
根据分析图,可以推到出马遍历的流程图所示。
开始
创建一个一维数组
以某一点为出发点, 走日字
走下一个日子 重新选择上一步的走 法 否 判断是否重复 否 是
判断是否走完所有格子
3 2 1 3 3 3 3 3 3 4 1 6 6 6 3 7 6 2 7 7 7 7 9 10 12 13 15 16 3 9 10 12 13 15 16 1 2 3 10 12 13 15 16 1 2 10 12 15 16 3 2 4 4 4 4 4 4 3 5 1 6 6 6 6 6 2 7 7 7 7 7 3 8 1 9 10 11 12 13 14 15 16 2 3 1 2 3 8 9 10 11 12 13 14 15 16 5 6 7 8 9 10 11 12 13 14 15 16
可以将每个猴子抽象成一个编号0~16。其中,0表 示第一个猴子,以后依次类推,16表示最后一只猴 子。然后将数到3的猴子淘汰,下一个猴子从1开始 数,根据题意,来看一下此问题的具体分析,如图 16.5所示。
1 0 0 0 0 0 3 0 1 1 1 1 3 1 1 3 3 3
2 1 1 1 1 1 1 2 3 3 3 3 2 6
在前面的章节中大家对C语言有了大概的了解,本 章将重点讲解几个常用到的经典例题,帮助大家加 深对C语言的掌握。
现有8×8的棋盘,要求在其中放入8个皇后,可以 使任意两个皇后不能吃掉对方。如果两个皇后在同 一行、同一列或者同一对角线,则其中的一个皇后 会吃掉另外一个皇后。试求出其所有可能的解,并 输出到屏幕。
…
500 70 25 600-500-70-25=5
将这些差值进行比较,最小的就是要选的三件物品
根据问题分析,可以推导出背包问题的流程图,如 图6.12所示。
开始 创建一个数组,存放九件 商品的重量
选出三件商品,将总重量 的值减去600
否
是否超出商品个数
是
将商品的差值做比较
结束
循环赛是大家经常见到的,现在设有n个选手要进 行乒乓球选拔赛,编写一个程序设计其比赛日程安 排表,具有以下要求: (1)每名选手都必须与其他选手比赛一次。 (2)每名选手一天之内只能进行一次比赛。 (3)所有选手的比赛在n-1天内比完。
500 600 70 100 80 25 55 40 90
500 600 100 500+600+100=1200
500 100 90 500+100+90=690
500 90 80 500+90+80=670
500 90 55 500+90+55=645
500 80 25 500+80+25=605
是 结束
魔术方正又称幻方阵、魔方阵,是一种已流传千年 的数字排列,不管是中西方对这奇妙的阵列都有所 理解。所谓魔术方阵,就是将连续的整数1、2、 3、…、n,按某种特别的顺序排在方阵里,方阵中 的每一行每一列或对角线位置的数各自相加的和均 相等。用简捷连续填数法创建魔术方正。
下面以填充一个3阶魔术方正为例,根据题意,看 一下此题的分析图,如图16.20所示
根据问题分析,可以推导出八皇后的算法设计流程 图。
开始
建立一个整型 数组
将一个皇后放 入棋盘中
将第二个皇后 放入棋盘中 重放前面的皇 后 是 判断是否和其他皇后放在在同一 行,同一列,同一对角线上
否
放入下一个的 个皇后
否 放置的皇后是否是最后一个
是 结束
从前在古代印度罗门圣庙的僧尚中,有一种名为汉 洛塔的游戏。设有柱子A、B、C,其中柱子A上有 着若干个大小不等的圆盘,要将柱子A上的圆盘完 整地移动到C柱子上。要求每次只能移动最上面的 圆盘,并且可以将柱子B作为媒介,但大的圆盘不 能在小的圆盘之上。
红 白 蓝
R
W
B
W
W
B
R
B
W
R
ቤተ መጻሕፍቲ ባይዱ
B
W
W
W
W
B
R
B
R
R
B
B
W
W
W
W
R
B
R
R
B
B
B
W
W
W
W
R
R
R
B
B
B
W
W
W
W
R
R
R
根据分析图,可以推到出三色旗的流程图,如图所 示。
开始 创建一维数组有n个 元素 移动旗子
判断旗子的颜色
红旗子
蓝旗子
白旗子
向后移
向前移
留在中间
是否移完旗子
否
是
结束
人类建造迷宫已有5000年的历史。在世界的不同文 化发展时期,这些奇特的建筑物始终吸引人们沿着 弯弯曲曲、困难重重的小路吃力地行走,寻找真相。 现在给定一迷宫,编写一程序实现从入口走出迷宫。
设A柱上有从小到大的3个盘子,因为大盘不能在小 盘之上,因此将A柱中最大的盘子移动到C柱之前, C柱必须为空。可以先将A柱中的2个盘子先移动到 B柱上,然后将第3个盘子移动到C柱上。当C柱上 已放有最大的盘子时,A柱为空,B柱上有2个盘子。 这时可将B柱上的1个盘子移动到A柱上,再将B柱 上的剩下的1个盘子移动到C柱上,如此循环直到最 后盘子的个数为1为止,直接将盘子移动到C盘上, 循环结束。根据题意,来看一下此问题的具体分析, 如图16.4所示。
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
5 6 7 8
6 5 8 7
7 8 5 6
8 7 6 5
每组和另一组比赛
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
下一只猴子数数下一 个数
否 判断猴子是不是数到三
是
判断是不是最后一只猴子
否 去掉数三的猴子,下 一只从一开始数
是
结束
最小公倍数(Least Common Multiple,缩写 L.C.M.),如果有一个自然数a能被自然数b整除, 则称a为b的倍数,b为a的约数,对于两个整数来说, 指该两数共有倍数中最小的一个。