计算机算法分析与设计(第四版)习题算法分析部分详解(实验六)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 using namespace std;

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 q;//声明 BoardNode 类的节点队列 q BoardNode E;

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,表示连

相关文档
最新文档