算法设计与分析作业四.docx
- 文档编号:25074985
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:14
- 大小:61.15KB
算法设计与分析作业四.docx
《算法设计与分析作业四.docx》由会员分享,可在线阅读,更多相关《算法设计与分析作业四.docx(14页珍藏版)》请在冰豆网上搜索。
算法设计与分析作业四
算法设计与分析
实验报告
学院信息科学与技术学院
专业班级软件工程3班
学号20122668
姓名王建君
指导教师尹治本
2014年10月
实验六N皇后问题
1、问题提出
N皇后问题,在N*N的方格棋盘上放置N个皇后,要求每个皇后不同行,不同列,不同对角线,其中N不小于3。
2、求解思路
要解决N皇后问题,其实就是要解决好怎么放置这n个皇后,每一个皇后与前面的所有皇后不能在同一行、同一列、同一对角线,在这里我们可以以行优先,就是说皇后的行号按顺序递增,只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。
如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。
此即是回溯法的精髓所在。
当第n个皇后放置成功后,即得到一个可行解,此时再回到上一个皇后重新放置寻找下一个可行解...如此后,即可找出一个n皇后问题的所有可行解。
3、算法复杂度
本实验采用迭代回溯的方法求解,算法复杂度为
。
4、实验源代码
#include
#include
intn,stack[100];//存当前路径
inttotal;//路径数
intatt(intl,inti)
{
intk;
for(k=1;k if(abs(l-k)==abs(stack[k]-i)||i==stack[k])return1; return0; } voidmake(intl)//递归搜索以stack[l]为初结点的所有路径 { inti,j;//子结点个数 if(l==n+1) { total=total+1;//路径数+1 for(i=1;i<=n;i++) { for(ints=0;s printf("*"); printf("Q"); for(s=stack[i];s printf("*"); printf("\n"); } printf("\n"); exit;//回溯(若试题仅要求一条路径,则exit改为halt即可) } for(i=1;i<=n;i++) { stack[l]=i;//算符i作用于生成stack[l-1]产生子状态stack[l]; if(! att(l,i))make(l+1); }//再无算符可用,回溯 } intmain() { system("title软件3班王建君20122668回溯法求八皇后问题"); printf("请输入皇后的个数: \n"); scanf("%d",&n); total=0;//路径数初始化为0 make (1);//从结点1出发,递归搜索所有的路径 printf("皇后个数为%d时: \n",n); printf("共有%d种解法\n",total); printf("\n"); return0; } 五、结果分析 实验七TSP算法的实现 1、问题提出 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。 他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或旅费)最小。 例如: 给定4个城市{A,B,C,D,E}及其各城市之间的路程,找出其最短路径。 16 4 5 3 2、求解思路 首先是在图为完全图的前提下,构造各城市间的图的结构,采用邻接数组的形式,将各个城市间的距离存储于图的数组中,用一个函数递归寻找从同一个顶点出发的各个城市的所有路径,再求出各个路径的路程,并与相应的路径输出,对路程数组进行冒泡排序后,经比较找出最短路径并输出。 3、算法复杂度 本实验通过递归法实现路径的排序,故其时间复杂度为O((n-1)! /2)。 4、实验源代码 #include usingnamespacestd; #defineMAX_VEX_NUM20//最大顶点数 int**Mat;//定义动态二维数组,存储生成的排列 int*list;//定义动态辅助数组 int*Count;//定义动态计数数组 int*Help;//定义动态辅助数组 inte=0;//定义全局变量 structMGraph { charvexs[MAX_VEX_NUM];//顶点向量 intarcs[MAX_VEX_NUM][MAX_VEX_NUM];//邻接矩阵 intvexnum,arcnum;//顶点数,边数 };//AdjMatrix MGraphG;//声明一个无向图的邻接矩阵类型 intvisited[MAX_VEX_NUM];//设置标志数组 intLocatevex(MGraphG,charv)//图的基本操作,寻找顶点V的位置 { inti=0; while(i =G.vexs[i]) i++; if(i returni;//查找成功则返回顶点的下标 else return-1; } intCreateUDG(MGraph&G)//数组邻接矩阵表示法构造无向图 { charv1,v2; intweight;//权值 cout<<"请输入图的顶点数和弧数"< cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点值"< for(inti=0;i cin>>G.vexs[i]; for(intq=0;q { for(intp=0;p { G.arcs[q][p]=0;//初始化邻接矩阵 } } for(intk=0;k { cout<<"输入该弧依附的顶点和权值: "< cin>>v1>>v2>>weight; inta=Locatevex(G,v1); intb=Locatevex(G,v2); G.arcs[a][b]=weight; G.arcs[b][a]=G.arcs[a][b]; } cout<<"图的顶点: "; for(intn=0;n cout< cout< cout< cout<<"该图的邻接矩阵表示为: \n"; for(intx=0;x { for(inty=0;y { cout< } cout< } cout< cout< return1; }//CreateUDG template voidPerm(Typelist[],intk,intm)//递归函数,生成排列,寻找最佳路径 { intc=1; inta=m; while(a>1)//定义Mat数组的行数 { c=c*a*(a-1); a-=2; } intd=m+1;//定义Mat数组的列数 if(k==m&&list[0]==0) { for(inti=0;i<=m;i++) { Mat[e][i]=list[i];//符合条件时生成排列,存储在数组Mat中 } e++; } if(Mat[c-1][m]! =-1&&e==c)//当找出所有可能路径时,计算所有路径长度,并找到最短路径 { for(intg=0;g { for(inth=0;h { intx=Mat[g][h];//获取路径坐标 inty=Mat[g][h+1]; Count[g]=Count[g]+G.arcs[x][y];//计算路径长度 } } cout<<"所有路径及其路径长度: "< for(g=0;g { for(inth=0;h<=d;h++) { intk=Mat[g][h]; cout< } cout<<""< } for(g=0;g Help[g]=Count[g];//赋值 for(inti=0;i { for(intj=1;j { if(Help[i]>Help[j]) { inttemp=Help[i]; Help[i]=Help[j]; Help[j]=temp; } } } intMin_way=Help[0];//Min_way为最短路径 for(i=0;i { if(Count[i]==Min_way) { cout<<"旅行商最佳路径为: "; for(intj=0;j<=d;j++) { intk=Mat[i][j]; cout< } cout<<"路径长度为: "< cout< } } } else { for(inti=k;i<=m;i++)//递归生成排列组合 { Swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]); } } } template inlinevoidSwap(Type&a,Type&b)//字符交换函数 { Typetemp=a;a=b;b=temp; } voidInicialize(MGraph&G)//初始化各个数组函数 { inta=G.vexnum;//图的顶点数,列数 intb=a-1;//辅助变量 intc=a-1; intn=1;//辅助变量,行数 while(b>1) { n=n*b*(b-1); b-=2; } Mat=newint*[n]; for(inti=0;i { Mat[i]=newint[a]; for(intj=0;j<=a;j++) { if(j { Mat[i][j]=-1;//数组初始化 } else { Mat[i][j]=0; } } } list=newint[a];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 作业