回溯算法的实验报告.doc.doc

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

实 验 报 告 实验目的: 通过分析求符号三角形问题的回溯法并编程实现,掌握回溯法的算法框架。 实验任务: 分析求符号三角形问题的回溯算法,编程实现,调试运行程序并对运行结果进行分析,分析算法的时空复杂度。 实验内容: 1、实现回溯法求符号三角形问题描述 2、算法描述 3、程序设计 实验结果与分析: 问题描述: 一般情况下,符号三角形的第一行有n个符号,三角形中任意位置都为“+”或“-”,且满足以下两个规则: 1)三角形中任意行的下一行的符号由以下规则确定:2个同号下面是“+”,2个异号下面是“-”; 2)三角形中“+”或“-”数目相同。 对于给定的n,计算有多少个不同的符号三角形。 问题分析: 对于符号三角形问题,用n元组x[1:n]表示符号三角形的第一行的n个符号。当x[i]=1时,表示符号三角形的第一行的第i个符号为“+”号;当x[i]=0时,表示符号三角形的第一行的第i个符号为“-”号;1 ≤ i≤ n。由于x[i]是二值的,所以在用回溯法解符号三角形问题时,可以用一棵完全二叉树来表示其解空间。在符号三角形的第一行的前i个符号x[1:i ]确定后,就确定了一个由i*(i+1)/2个符号组成的符号三角形。下一步确定了x[i+1]的值后,只要在前面已确定的符号三角形的右边加一条边,就可以扩展为x[1:i+1]所相应的符号三角形。最终由x[1:n]所确定的符号三角形中包含的“+”号个数与“-”号个数同为n*(n+1)/4。因此在回溯有哪些信誉好的足球投注网站过程中可用当前符号三角形所包含的“+”号个数与“-”号个数均不超过n*(n+1)/4作为可行性约束,用于剪去不满足约束的子树。对于给定的n,当n*(n+1)/2为奇数时,显然不存在所包含的“+”号个数与“-”号个数相同的符号三角形。 程序代码: #include iostream.h class Triangle { friend int Computer(int n); public: void Backtrack(int t); int n, //第一行的符号个数 half, //每个三角形总符号数的一半 count, //统减号的个数 **p; //指向三角形的二维指针 long sum; //统计符合条件的的三角形的个数 }; void Triangle::Backtrack(int t) { if ((counthalf)||(t*(t-1)/2-counthalf)) { return; // 如果加号或减号的个数大于符号三角形中总符号数的一半则退出函数 } if (tn) //符号填充完毕 { nsum++; //打印符号 for (int i = 1;i=n;i++) //第i行 { for (int k = i;k=0;k--) //先输出必要的空格 { cout ; } for (int j = 1;j=n-i+1;j++) //输出符号三角形第i行第i-1+k个位置 { if (p[i][j] == 0) //如果该位为0,输出“+” { cout+ ; } else { if (p[i][j] == 1) //如果该位为1,输出“-” { cout- ; } } } coutendl; } } else for (int i = 0;i2;i++) { p[1][t] = i; //确定该位置的符号 count += i; //若该位置为减号,则减号数增1,否则,减号数不变 for (int j = 2;j=t;j++) //因第t个位置确定,对应三角形的该斜行可以确定 { p[j][t-j+1] = p[j-1][t-j+1]^p[j-1][t-j+2]; //通过异或运算下行符号 count += p[j][t-j+1]; //减号数 } Backtrack(t+1); //对第一行的第t+1个位置进行回溯算法 for (j = 2;j=t;j++) //回溯,减去该斜行的减号数 { count -= p[j][t-j+1]; } count -= i; //减去第一行第t个位置的减号数 } } in

文档评论(0)

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

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

1亿VIP精品文档

相关文档