02 算法设计基础

算法设计基础
一、目的要求:
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术。
(2)提高应用分治法设计算法的技能
(3)理解这样一个观点:分治和递归经常同时应用在算法设计中。

二、实验内容:
(1)设计算法求解整数的划分问题,对给定的整数,输出划分数(P13),并思考如何实现输出每个具体的划分。
(2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础上修改程序,使其能解决有重复元素的排列问题(P42算法实现题2-5)。
(3)设计算法求解特殊棋盘的覆盖问题,并编程实现(P20)。

三、实验主要流程、基本操作或核心代码、算法片段
(1)设计算法求解整数的划分问题,对给定的整数,输出划分数(P13),并思考如何实现输出每个具体的划分。
问题分析和设计:
递归函数的声明为 int split(int n, int m);其中n为要划分的正整数,m是划分中的最大加数(当m > n时,最大加数为n),
Ⅰ.当n = 1或m = 1时,split的值为1,可根据上例看出,只有一个划分1 或 1 + 1 + 1 + 1 + 1 + 1程序可表示为if(n == 1 || m == 1) return 1;
m和n有三种关系
(1) m > n 在整数划分中实际上最大加数不能大于n,因此在这种情况可以等价为split(n, n);
可用程序表示为if(m > n) return split(n, n);
(2) m = n 这种情况可用递归表示为split(n, m - 1) + 1,可用程序表示为if(m == n) return (split(n, m - 1) + 1);
(3) m < n 可用程序表示为split(n, m - 1) + split(n - m, m)
程序源代码:
在这里插入图片描述
在这里插入图片描述
(2)设计算法求解n个互异元素的全排列的算法并编程实现(P13),并在此基础上修改程序,使其能解决有重复元素的排列问题(P42算法实现题2-5)。
问题分析和设计:
n个互异元素的全排列,n个元素依次分别放在第一个位置,剩下的n-1个元素依次排列,固定第一个元素将其他元素全排列,然后交换一位,再固定第一个元素(原第二个元素)其他元素全排列,如此往复直到所有元素都移动到了第一个元素位置一次。
程序源代码:
在这里插入图片描述

运行结果:
在这里插入图片描述

(3)设计算法求解特殊棋盘的覆盖问题,并编程实现(P20)。
问题分析和设计:
每次都对分割后的四个小方块进行判断,判断特殊方格是否在里面。这里的判断的方法是每次先记录下整个大方块的左上角(top left coner)方格的行列坐标,然后再与特殊方格坐标进行比较,就可以知道特殊方格是否在该块中。如果特殊方块在里面,这直接递归下去求即可,如果不在,这根据分割的四个方块的不同位置,把右下角、左下角、右上角或者左上角的方格标记为特殊方块,然后继续递归。在递归函数里,还要有一个变量s来记录边的方格数,每次对方块进行划分时,边的方格数都会减半,这个变量是为了方便判断特殊方格的位置。其次还要有一个变nCount来记录L型骨牌的数量。
程序源代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值