计算机算法分析与设计第四版习题算法分析部分详解实验六.docx
- 文档编号:8021249
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:24
- 大小:21.50KB
计算机算法分析与设计第四版习题算法分析部分详解实验六.docx
《计算机算法分析与设计第四版习题算法分析部分详解实验六.docx》由会员分享,可在线阅读,更多相关《计算机算法分析与设计第四版习题算法分析部分详解实验六.docx(24页珍藏版)》请在冰豆网上搜索。
计算机算法分析与设计第四版习题算法分析部分详解实验六
实验六分支限界法
//6-1、6-6项目VC++6.0测试通过
//6-15项目VC2005测试通过
//6-1最小长度电路板排列问题
//头文件stdafx.h
//stdafx.h:
includefileforstandardsystemincludefiles,
//orprojectspecificincludefilesthatareusedfrequently,but
//arechangedinfrequently
//
#pragmaonce
#defineWIN32_LEAN_AND_MEAN//Excluderarely-usedstufffromWindowsheaders
#include
#include
//TODO:
referenceadditionalheadersyourprogramrequireshere
//sy61.cpp:
Definestheentrypointfortheconsoleapplication.
//
//Description:
//分支限界法6_1最小长度电路板排列问题
//#include"my.h"
#include"stdafx.h"
#include
#include
usingnamespacestd;
intn,m;
//#include"OutOfBounds.h"
//定义节点类
classBoardNode{
friendintFIFOBoards(int**,int,int,int*&);//非类成员,可以访问私有成员的函数,最优序列查找
public:
operatorint()const{returncd;}//返回常数cd
intlen();
public:
int*x,s,cd,*low,*high;//x表示当前节点的电路板排列,s表示当前节点排列好的电路板的数
//表示当前节点的最大长度,low,high分别表当前节点表示每一个连接块的第一个,和最后一个电路板
//的位置
};
//编写类的len()函数,求出当前节点的连接块长度的最大值
intBoardNode:
:
len()
{
inttmp=0;
for(intk=1;k<=m;k++)
if(low[k]<=n&&high[k]>0&&tmp tmp=high[k]-low[k]; returntmp; } intFIFIOBoards(int**B,intn,intm,int*&bestx)//n为电路板的数量,m为连接块的数量 { //intbestd; queue BoardNodeE; E.x=newint[n+1];//为数组指针x分配n+1个动态空间,存储当前的排列 E.s=0;//最初时,排列好的电路板的数目为0 E.cd=0; E.low=newint[m+1];//存储每个连接块的第一个电路板的位置 E.high=newint[m+1];//存储每个连接块的最后一个电路板的位置 for(inti=1;i<=m;i++) { E.high[i]=0;//初始化开始时的每个连接块的最后一个电路板的位置为0,表示连接块i还没有电路板放入E.x的排列中 E.low[i]=n+1;//初始化开始时的每个连接块的第一个电路板的位置为n+1,表示连接块i还没有电路板放入E.x的排列中 } for(i=1;i<=n;i++) E.x[i]=i;//初始化E.x的排列为1,2,3.....n intbestd=n+1;//最优距离 bestx=0;//记录当前最优排列 do{ if(E.s==n-1)//当已排列了n-1个时 { //判断是否改变每个连接块的最后一个电路板的位置 for(intj=1;j<=m;j++) if(B[E.x[n]][j]&&n>E.high[j]) E.high[j]=n; intld=E.len();//存储当前节点的各连接块长度中的最大长度 //如果当前的最大长度小于了n+1 if(ld { delete[]bestx; bestx=E.x; bestd=ld;//最优距离 } elsedelete[]E.x;//删除分配给E.x的数组空间 delete[]E.low;//删除分配给E.low的数组空间 delete[]E.high;//删除分配给E.high的数组空间 } else { intcurr=E.s+1;//rr记录现在应该排列第几个电路板 for(inti=E.s+1;i<=n;i++)//处理扩展节点下一层所有子节点 { BoardNodeN; N.low=newint[m+1];//与if中的意思相同 N.high=newint[m+1]; for(intj=1;j<=m;j++) { N.low[j]=E.low[j];//将E.low[]中的值赋给N.low[] N.high[j]=E.high[j]; if(B[E.x[i]][j]) { if(curr N.low[j]=curr;//若当前节点连接块j的第一个电路板的位置比现在正在排列的电路板的位置还小 if(curr>N.high[j]) N.high[j]=curr; } } N.cd=N.len(); //如果,当前节点的最大长度小于了最优长度则: if(N.cd { N.x=newint[n+1]; N.s=E.s+1; for(intj=1;j<=n;j++) N.x[j]=E.x[j]; N.x[N.s]=E.x[i];//交换位置 N.x[i]=E.x[N.s];//交换位置 q.push(N);//将节点N加入队列中 } else { delete[]N.low; delete[]N.high; } //printf("%d",bestd); } delete[]E.x;//当前扩展节点所有子节点均考虑,变成死结点 } //try{ if(! q.empty()){ E=q.front();//取队列首节点作为扩展节点 q.pop(); }elsereturnbestd; //} //catch(OutOfBounds) //{ //returnbestd; //} //printf("finish"); }while(! q.empty()); returnbestd; return1; } //测试 voidmain() { //scanf("%d%d",&n,&m); cin>>n>>m; int**B=newint*[n+1]; for(intt=0;t<=n;t++) B[t]=newint[m+1]; for(inti=1;i<=n;i++) for(intj=1;j<=m;j++) cin>>B[i][j]; //scanf("%d",&B[i][j]); int*bestx=newint[n+1]; intbestd=0; bestd=FIFIOBoards(B,n,m,bestx); printf("%d\n",bestd); for(i=1;i<=n;i++){ cout< } cout< } //6-6经典n皇后问题 //Description: 经典n皇后问题广度优先建议n<=14解空间为子集树 //参考答案说排列树是不正确的,本例打印n*n棋盘的所有解,即放置方法 #include #include #include #include #include usingnamespacestd; //本例子直接输入棋盘大小,不用文件 //ifstreamin("input.txt");//请在项目文件夹下新建一个input.txt //ofstreamout("output.txt"); classNode{ public: Node(intn){ t=0; this->n=n; loc=newint[n+1]; for(inti=0;i<=n;++i) { loc[i]=0; } } Node(constNode&other){ this->t=other.t; this->n=other.n; this->loc=newint[n+1]; for(inti=0;i<=n;++i){ this->loc[i]=other.loc[i]; } } intt;//已放置t个皇后 int*loc;//loc[1: t] intn;//共放置n个皇后 boolcheckNext(intnext); voidprintQ(); }; boolNode: : checkNext(intnext){ inti; for(i=1;i<=t;++i) { if(loc[i]==next)//检测同列 { returnfalse; } if(loc[i]-next==t+1-i)//检测反斜线行差==列差 { returnfalse; } if(loc[i]-next==i-t-1)//检测正斜线 { returnfalse; } } returntrue; } voidNode: : printQ(){ for(inti=1;i<=n;++i) { cout< } cout< } classQueen{ public: intn;//n皇后 intansNum;//对于n皇后解的个数 Queen(intn){ this->n=n; ansNum=0; } voidArrangQueen(); }; voidQueen: : ArrangQueen(){ queue Nodeini(n);//初始化 Q.push(ini); while(! Q.empty()){ Nodefather=Q.front();//取队列下一个节点 Q.pop(); if(father.t==n) { father.printQ(); ++ansNum; } for(inti=1;i<=n;++i)//一次性将当前扩展节点所有子节点考虑完,符合条件的插入队列 { if(father.checkNext(i)) { NodeChild(father); ++Child.t; Child.loc[Child.t]=i; Q.push(Child); } } } } intmain(){ //#defineincin //#defineoutcout cout<<"请输入棋盘大小n: "; intn; cin>>n;//从文件中读入一个整数 //for(intCase=1;Case<=cases;++Case){ //intn; //in>>n; QueenQ(n); Q.ArrangQueen(); //out<<"Case#"< "< cout<<"共"< "< //} return0; } //6-15排列空间树问题VC2005测试通过 //stdafx.h头文件 //stdafx.h: includefileforstandardsystemincludefiles, //orprojectspecificincludefilesthatareusedfrequently,but //arechangedinfrequently // #pragmaonce #defineWIN32_LEAN_AND_MEAN//Excluderarely-usedstufffromWindowsheaders #include #include //TODO: referenceadditionalheadersyourprogramrequireshere //头文件MinHeap2.h;最小堆实现 #include template classGraph; template classMinHeap { template friendclassGraph; public: MinHeap(intmaxheapsize=10); ~MinHeap(){delete[]heap;} intSize()const{returncurrentsize;} TMax(){if(currentsize)returnheap[1];} MinHeap MinHeap voidInitialize(Tx[],intsize,intArraySize); voidDeactivate(); voidoutput(Ta[],intn); private: intcurrentsize,maxsize; T*heap; }; template voidMinHeap : output(Ta[],intn) { for(inti=1;i<=n;i++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 算法 分析 设计 第四 习题 部分 详解 实验