算法设计与分析分支界限法实验报告.docx
- 文档编号:23107906
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:13
- 大小:87.09KB
算法设计与分析分支界限法实验报告.docx
《算法设计与分析分支界限法实验报告.docx》由会员分享,可在线阅读,更多相关《算法设计与分析分支界限法实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
算法设计与分析分支界限法实验报告
《算法设计与分析》实验报告
实验四分治限界法
报告书
姓名
指导教师
学号
日期
班级
实验内容
1.迷宫最短路径
在下图中,请使用广度搜索求出a到b的最短路径,有色区域为不可通过区域。
2.树上最短路径
dashen是个牛人。
很多人都想认识dashen,但没有这个机会,于是shen粉们便想了一个方法,计算自己与dashen的ACM距离,因此很多人都去参加ACM,而ACM因此也改名为ACM国际水赛。
每个ACM有n个组,每组3个人。
同组的3个人都是队友。
大家都想知道自己与dashen的最小距离是多少。
dashen与自己的最小距离当然是0。
dashen的队友和dashen的最小距离是1。
dashen的队友的队友和dashen的最小距离是2……以此类推。
如果实在和dashen没有关系的只好输出undefined了。
第一行读入n。
表示有n个组。
1≤n≤100
接下来n行,每行有3个名字,名字之间用空格隔开。
每个名字的开头都是大写的。
每行输出一个名字,名字后面空格后输出数字a或者字符串undefined,a代表最小距离。
名字按字典序输出。
[SampleInput]
7
dashenOparinToropov
AyzenshteynOparinSamsonov
AyzenshteynChevdarSamsonov
FominykhdashenOparin
DublennykhFominykhIvankov
BurmistrovDublennykhKurpilyanskiy
CormenLeisersonRivest
[SampleOutput]
Ayzenshteyn2
Burmistrov3
Chevdar3
Cormenundefined
Dublennykh2
Fominykh1
dashen0
Ivankov2
Kurpilyanskiy3
Leisersonundefined
Oparin1
Rivestundefined
Samsonov2
Toropov1
实验目的
1)掌握学习什么是分支界限法。
2)掌握学习BFS(宽度优先搜索)的思想过程以及编码实现。
3)掌握学习简单的BFS题目如何去思考并解决实施。
4)学习培养基础的快速变成能力、独立思考恩能够立与解决bug的能力。
实验过程和步骤
1.迷宫最短路径
1.2解题思路
迷宫搜索最短路径,主要考察的就是最简单裸的BFS。
BFS只要掌握如何标记好数组、边界的考虑、出队进队就好了。
如何保存搜索的层数?
每一次节点扩散层,标记的层数值都是当前层的+1即可。
至于写BFS的写法。
步骤都是一样的:
放第一个进队,然后出队、扩散开进队并标记、出队......循环下去直到队空。
写法太基础就不讲解了。
1.2测试样例
7
32
46
..#....
..##...
....#..
...##..
#...#..
###....
###....
1.3程序运行情况
1.4程序源码(含注释)
#include"bits/stdc++.h"
usingnamespacestd;
#defineinf999
intn;//行数
intsx,sy;//起点
intgx,gy;//终点
chare[inf][inf];//地图
intbook[inf][inf];//标记地图
intpos[4][2]={-1,0,1,0,0,1,0,-1};//方位,上下右左
voidread()//输入数据
{
printf("inputtherowofthemap:
");
scanf("%d",&n);
printf("nowinputthepoint:
\n");
scanf("%d%d%d%d",&sx,&sy,&gx,&gy);//输入下标自1开始
sx--;//计算下标从0开始
sy--;
gx--;
gy--;
printf("inputthemapnow:
\n");
for(inti=0;i scanf("%s",e[i]); printf("\n"); memset(book,0,sizeofbook);//初始化 } structNode//节点 { intx,y; Node(inti,intj): x(i),y(j) { } }; boolislegal(intx,inty)//判断是否合法 { if(x<0||x>=n||y<0||y>=n)returnfalse; returntrue; } voidbfs()//方便快捷 { queue while(! q.empty())q.pop();//初始化 q.push(Node(sx,sy));//放入首节点 book[sx][sy]=0;//标记 while(! q.empty()) { Nodet=q.front(); q.pop();//取出节点 inttag=book[t.x][t.y]; if(t.x==gx&&t.y==gy)break;//提前结束 for(inti=0;i<4;i++) { intx=t.x+pos[i][0]; inty=t.y+pos[i][1]; if(islegal(x,y)&&e[x][y]=='.'&&! book[x][y])//放入未越界、可走、未走过的 { q.push(Node(x,y)); book[x][y]=tag+1; } } } } voidoutput() { printf("---------------------\n"); inti,j; for(i=0;i { for(j=0;j printf("%d",book[i][j]); printf("\n"); } } intmain() { read();//输入 bfs(); output();//输出 return0; } 2树上最短路径 2.1解题思路 问题问每个人和dashen的距离,组员的距离为1。 也就是说,人与人之间的距离都是通过“组员”来不断量化的。 那么可以想到,组员之间可以画一条边,问题问的整个人际之间的图建好之后,将人看为节点,求出每个节点与某个定点的最短距离。 这个图的遍历+定点最短距离问题显然用BFS很好解决。 问题的难点: 1)映射字符串到id的关系,我用的是STL的map容器解决。 2)保存点之间边的关系,本来用的是矩阵保存,但是写到后来很麻烦,就用邻接表保存 3)输出的时候有点麻烦 2.2测试样例 7 dashenOparinToropov AyzenshteynOparinSamsonov AyzenshteynChevdarSamsonov FominykhdashenOparin DublennykhFominykhIvankov BurmistrovDublennykhKurpilyanskiy CormenLeisersonRivest 2.3程序运行情况 2.4程序源码(含注释) #include"bits/stdc++.h" usingnamespacestd; #defineinf999 #defineINF999999999 intn,num;//行数,以及不重复人数 intorigin;//起点,即dashen的标号 intbook[inf];//标记 vector structStudent{//学生类,下标自1始 stringname; intid; intrank; voidset(strings,inti) { name=s; id=i; rank=INF;//所有人的距离默认无穷大 } booloperator<(constStudent&t)const { name } }student[inf]; voidread()//输入数据 { num=0;//人数初始化 memset(book,0,sizeofbook);//初始化标记 cout<<"inputthenumofthegroups: "; cin>>n; cout<<"nowinputtheeachgroupmates: \n"; map m.clear(); strings[3];//临时存放 for(inti=0;i { for(intj=0;j<3;j++)//读入点,建点 { cin>>s[j]; if(m[s[j]]==0)//没出现过就赋予标号以及存储名字 { m[s[j]]=++num; student[num].set(s[j],num);//存储此人id和名字 } if(s[j]=="dashen") origin=m[s[j]]; } for(intj=0;j<2;j++)//建图 for(intk=j+1;k<3;k++) { inta=m[s[j]]; intb=m[s[k]]; edge[a].push_back(b);//加入边集 edge[b].push_back(a); } } printf("\n"); } voidbfs()//根据id进行bfs { queue while(! q.empty())q.pop();//初始化 q.push(origin);//放入首节点 book[origin]=1;//标记走过 student[origin].rank=0;//dashen是0 while(! q.empty()) { intv=q.front(); q.pop();//取出节点 intlen=edge[v].size(); for(inti=0;i { intu=edge[v][i]; student[u].rank=min(student[v].rank+1,student[u].rank); if(! book[u]) { q.push(u); book[u]=1; } } } } voidoutput() { printf("---------------------\n"); inti; sort(student+1,student+num+1);//排序 for(i=1;i<=num;i++) { cout< intid=student[i].id; if(student[i].rank==INF) cout<<"undefined"< else cout< } } intmain() { read();//输入 bfs(); output();//输出 return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 分支 界限 实验 报告