计算机算法分析与设计(第四版)习题算法分析部分详解(实验六)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六分支限界法
//6-1、6-6 项目VC++6.0 测试通过
//6-15 项目VC2005 测试通过
//6-1 最小长度电路板排列问题
//头文件stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
// #pragma once
// Exclude rarely-used stuff from Windows headers
#define WIN32_LEAN_AND_MEAN
#include
#include
// TODO: reference additional headers your program requires here
// sy61.cpp : Defines the entry point for the console application. //
//Description:
//分支限界法6_1 最小长度电路板排列问题
//#include "my.h"
#include "stdafx.h"
#include
#include
int n,m;
//#include "OutOfBounds.h" //定义节点类class BoardNode{
friend int FIFOBoards(int **,int ,int,int *&);// 非类成员,可以访问私有成员的函数,最优序列查找
public:
operator int() const{return cd;}// 返回常数cd
int len();
public:
int *x,s,cd,*low,*high;//x 表示当前节点的电路板排列,s 表示当前节点排列好的电路板的数
//表示当前节点的最大长度,low ,high 分别表当前节点表示每一个连接块的第一个,和最后
一个电路板
//的位置
};
〃编写类的len()函数,求出当前节点的连接块长度的最大值
int BoardNode::len()
{
int tmp=0;
for(int k=1;k<=m;k++)
if(low[k]<=n && high[k]>0 && tmp return tmp; } int FIFIOBoards(int **B ,int n ,int m ,int *&bestx)//n 为电路板的数量, m 为连接块的数量 { // int bestd; queue E.x=new int[n+1];// 为数组指针 x 分配 n+1 个动态空间,存储当前的排列 E.s=0;//最初时,排列好的电路板的数目为 0 E.cd=0; E.low=new int[m+1];// 存储每个连接块的第一个电路板的位置 E.high=new int[m+1];// 存储每个连接块的最后一个电路板的位置 for(int i=1;i<=m;i++) { E.high[i]=0;// 初始化开始时的每个连接块的最后一个电路板的位置为 块 i 还没有电路板放入 E.x 的排列中 E.low[i]=n+1;// 初始化开始时的每个连接块的第一个电路板的位置为 接块 i 还没有电路板放入 E.x 的排列中 } for(i=1;i<=n;i++) E.x[i]=i;// 初始化 E.x 的排列为 1, 2,3 n int bestd=n+1;// 最优距离 bestx=O;//记录当前最优排列 do{ if(E.s==n-1)// 当已排列了 n-1 个时 { //判断是否改变每个连接块的最后一个电路板的位置 for(int j=1;j<=m;j++) if(B[E.x[n]][j] && n>E.high[j]) E.high[j]=n; int ld=E.len();// 存储当前节点的各连接块长度中的最大长度 //如果当前的最大长 度小于了 n+1 if(ld { delete[] bestx; bestx=E.x; bestd=ld;//最优距离 } else delete[] E.x;//删除分配给 E.x 的数组空间 delete[] E.low;// 删除分配给 E.low 的数组空间 delete[] E.high;// 删除分配给 E.high 的数组空间 } else { int curr=E.s+1;//rr 记录现在应该排列第几个电路板 for(int i=E.s+1;i<=n;i++)// 处理扩展节点下一层所有子节点 { 0,表示连接 n+1,表示连