实验四回溯算法应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验四:回溯算法的应用——零件切割问题系别:计算机系 班级: 1班 姓名:阙寿辉 学号:22120051203884 日期:2008/06/18一、问题描述: 给定一块宽度为W的矩形板,矩形板的高度不受限制。现需要从板上分别切割出n个高度为hi,宽度为wi的矩形零件。切割的规则是零件的高度方向与矩形板的高度方向保持一致。问如何切割使得所使用的矩形板的高度h最小?例如:请设计出一个回溯算法:1.任给一个输入实例,能输出切割所需要的实际高度2.能用图形演示切割的过程二、算法思想: 首先将零件按高度从大到小的顺序排列好,在排序的时候本实验采用的是快排。选择零件中高度最高的一块,将该零件按照高度方向放入矩形,零件的左下角与矩形的左下角重合。这样,整个矩形空间已经被划分为三个部分:已经放上零件的一部分、所放零件的右部和所放零件的上部。然后在所放零件的右部和上部对剩余的零件采用回溯法,确定其放在哪个位置(此过程中应该考虑会不会越界)。在回溯过程中计算当前枝以后可能的最大高度上界。如果该上界比当前的最大高度还高,则剪去该枝,直至所有的零件都被放入矩形。最后计算出放入的最左各层零件最大高度之和。三、具体实现:1、木板和木块(将零件和矩形抽象)的数据结构定义如下:typedef struct MuKuai{ //木块结构体定义 float h; //木块高度 float w; //木块宽度 struct MuKuai *next; //木块链表}MuKuai;typedef struct MuBan{ //木板结构体定义 float x; //木板的左下脚横坐标 float y; //木板的左下脚纵坐标 float h; //木板高度 float w; //木板宽度 struct MuBan *next;//木板链表}MuBan;2、算法中用到的各变量声明如下:MuKuai *headMuKuai = NULL; //木块链表头指针MuBan *headMuBan = NULL; //木板链表头指针MuBan *A = NULL; //用于存放最终结果MuBan *X; //用于保存当前找到的路径MuBan *bestX; //用于保存当前找到的最佳路径int n; //木块总个数int Line; //用于控制递归深度float W; //木板宽度float h = 0; //当前找到的路径木板总高度float besth = 35767; //最佳路径木板高度int x = 0; //用于调整屏幕的相对坐标int k = 0; //用于动态显示木块变化float **C = NULL; //定义颜色数组头指针3、各函数功能如下:1. float **CreatFloatArray_2(float **Head,int m,int n){//根据输入的二维数组行和列动态创建二位数组,返回数组指针 int i,j; float *p=NULL; if( !(m 0 n 0) ) { //判断维度是否正确 printf(错误的数组维度\n); return NULL; } p = (float *)malloc(sizeof(float) * m * n);//申请总体空间 Head = (float **)malloc(sizeof(float *)*m);//申请二级指针空间 for(i = 0;i m;i++) Head[i]=p + n * i; for(i = 0;i m;i++) for(j = 0;j n;j++) Head[i][j] = 0; return Head;} 2. MuKuai *find(int k){//在木块链表中查找第k个元素 MuKuai *p = headMuKuai; if(k n) { printf(查找木块链元素失败!\n); return NULL; } for(int i = 1; i k; i++) p = p-next; return p;}3. void sortInsert(MuKuai *Q) {//在headMuKuai中按照非递

文档评论(0)

189****6140 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档