
递归
文章平均质量分 56
taesimple
这个作者很懒,什么都没留下…
展开
-
质数环问题
问题描述:给定正整数n,要求将n个正整数1, 2, ..., n组成一个环,确保环中任意两个相邻元素之和为质数 思路:回溯法。在枚举过程中进行回溯剪枝。另外,为确保不出现重复的环,令第一个元素为1 代码: int isp(int k){ //判断k是否为质数 int ok = 1; for(int i = 2; i < sqrt(k); i++){ if(k%i == 0){原创 2012-05-27 15:12:55 · 1080 阅读 · 1 评论 -
将数组分成和相等的若干子数组
问题描述:对一个整数数组,将其分为k个子数组,使得各数组的和相等。求k的最大值 思路: 1.记数组a中的最大元素为max,a本身的和为sum,则m的值不会超过ceil(sum/max)。因为若m > ceil(sum, max),则max不可能被放到任何一个子数组中 2.在1的基础上,记k为当前分割份数,k从ceil(sum, max)遍历至1,判断能否分成k个相等和子数组,具体判断方法为:原创 2012-05-27 18:39:30 · 1501 阅读 · 1 评论 -
特殊矩阵运算
问题描述:假设矩阵存在某种特殊运算,要求对矩阵任意一个元素减1时,必须对其邻居(上下左右)中的一个同时减1。现给定一个矩阵,要求判断能否通过有限次特殊运算得到零矩阵 思路:回溯法。枚举所有可进行特殊运算的位置并以此递归,若出现元素小于0的情况则进行回溯。不用每次判断零矩阵,只需要维护一个计数变量cnt,统计当前矩阵非零元素个数。每次进行特殊运算时,更新cnt的值 代码(效率较低,应该可以进一步原创 2012-05-27 19:59:33 · 403 阅读 · 0 评论 -
单链表逆输出
实际上递归实现单链表逆输出不一定优于辅助堆栈或辅助数组,只是可读性更强 代码: typedef struct node{ int data; struct node * next; } Node; void print(Node * p){ assert(p != NULL); if(p->next != NULL) //递归,先输出后继结点 print(p->n原创 2012-05-23 14:36:52 · 286 阅读 · 0 评论 -
子集和问题
问题描述:对给定集合A和整数K,求出A的所有和等于K的子集(可以包括其本身),如A = {10, 20, 30, 40, 50, 60}且K = 60,则满足条件的子集有{10, 20, 30}, {10, 50}, {20, 40}, {60} 思路1:利用二进制法枚举子集,再找出满足条件的子集。此方法优点是思想简单,缺点是枚举本身效率不高 代码: void process(int原创 2012-05-25 16:23:11 · 438 阅读 · 0 评论 -
八皇后问题
问题描述:在8×8的棋盘上放置8个皇后,确保她们互不攻击(皇后攻击范围为同行、同列以及同对角线) 思路:首先可以确定在此问题的任意一个正确解里,8个皇后必然各占一行(不能同行),因此问题可以简化为:为每一行的皇后找到正确的对应列(列必然也是互异的)。若用穷举法(全排列)的话,共有8! = 40320种可能。在此基础上,我们使用回溯法减少不必要的枚举,具体为:每次放置一个皇后,若该皇后与之前放置的原创 2012-05-25 19:43:12 · 315 阅读 · 0 评论 -
字符串全排列
字符串全排列的两个例子: 1.abc的全排列有: abc acb bac bca cba cab 2.aab的全排列有: aab aba baa 思路:使用回溯法。对于abc,a和a交换仍是abc;a和b交换可得bac;a和c交换可得cba,至此第一个字母的遍历结束。从上述结果中进行第二个字母的遍历:对于abc,b和b交换仍是abc,b和c交换可得acb;对于bac原创 2012-05-23 21:21:46 · 457 阅读 · 0 评论