第08章_递归算法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第08章_递归算法

if(B == 0) f = -1; else f = 1; for(j = 1; j = 5; j++) { switch(j) { case 1: w = W + f*1; d = D; break; case 2: w = W + f*2; d = D; break; case 3: d = D + f*1; w = W; break; case 4: d = D + f*2; w = W; break; case 5: w = W + f*1; d = D + f*1; break; } b = 1 - B; if(IsValid(w, d, b)) { flags[w][d][b] = 1; steps[s].W = w; steps[s].D = d; steps[s].B = b; s++; if(w == 0 d == 0 b == 1) { num ++; printf(Solutions %d: \n, num); for(i = 0; i s; i++) printf(%d %d %d\n, steps[i].W, steps[i].D, steps[i].B); } else CrossRiver(w, d, b); flags[w][d][b] = 0; s--; } } } int IsValid(int w, int d, int b) { if(w 0 || w M) return 0; if(d 0 || d N) return 0; if(flags[w][d][b] == 1) return 0; if(d 0 w d) return 0; if((N-d 0) (M-w N-d)) return 0; return 1; } 2 2 Solutions 1: 2 2 0 0 2 1 1 2 0 1 0 1 2 0 0 0 0 1 Solutions 2: 2 2 0 0 2 1 1 2 0 1 0 1 1 1 0 0 0 1 Solutions 3: 2 2 0 1 1 1 1 2 0 1 0 1 2 0 0 0 0 1 Solutions 4: 2 2 0 1 1 1 1 2 0 1 0 1 1 1 0 0 0 1 8.3.4 排列问题 n个对象的一个排列,就是把这 n 个不同的 对象放在同一行上的一种安排。例如,对于 三个对象 a,b,c,总共有6个排列: a b c a c b b a c b c a c a b c b a n 个对象的排列个数就是 n!。 如何生成排列? 基于分治策略的递归算法: 假设这 n 个对象为 1, 2, 3, …, n; 对于前n-1个元素的每一个排列 a1 a2 … an-1,1?ai ? n-1,通过在所有可能的位置上插入 数字 n,来形成 n 个所求的排列,即: n a1 a2 … an-1 a1 n a2 … an-1 …… a1 a2 … n an-1 a1 a2 … an-1 n 例如:生成1,2,3的所有排列 permutation(3) ? permutation(2) ? permutation(1) permutation(1):1 permutation(2):2 1,1 2 permutation(3):3 2 1,2 3 1,2 1 3, 3 1 2,1 3 2,1 2 3 基于回溯策略的递归算法: 基本思路:每一个排列的长度为 N,对这N个不同的位置,按照顺序逐一地枚举所有 可能出现的数字。 定义一维数组NumFl

文档评论(0)

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

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

1亿VIP精品文档

相关文档