宽度优先搜索

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宽度优先搜索
走迷宫(Maze)
【问题描述】
已知一N×N的迷宫,允许往上、下、左、右四个方向行走, 现请你找出一条从左上角到右下角的最短路径。
【输入数据】
输入数据有若干行,第一行有一个自然数N(N≤20),表示 迷宫的大小,其后有N行数据,每行有N个0或1(数字之 间没有空格,0表示可以通过,1表示不能通过),用以 描述迷宫地图。入口在左上角(1,1)处,出口在右下 角(N,N)处。所有迷宫保证存在从入口到出口的可行 路径。
结构一:求一个解、所有解、最优解 while front<=rear {
由front状态去寻找新的目标状态 if 找到新的状态没有出现过
{ 把新状态添加进队列(rear++) if 新的状态就是目标状态 做相应处理(退出循环输出解、输出当前解、比较解的优劣)
} front++\\front状态可能到达的状态穷举完毕,则出队,进入下一个 状态去寻求新状态 }
宽度优先搜索(宽搜,BFS)
宽度优先搜索算法又称为广度优先搜索,是最简便的图的搜 索算法之一,这个算法是很多重要的图论算法的模型;
BFS(Breadth First Search)属于一种盲目搜寻法,目的 是系统地展开并检查图中的所有节点,以找寻目标节点(目 标状态);
换句话说,它并不考虑结果的可能位置,不关心搜索的快慢 好坏,就是彻底地搜索整张图,直到找到目标节点为止(或 者无解);
bfs应用举例
例1:迷宫宽搜程序怎么实现
从算法的观点看,所有因为展开节点而得到的子节点都会被 加入到一个先进先出的队列中,所以是队列的重要应用。
六、宽度优先搜索(宽搜,bfs)
通过搜索树,比较BFS与DFS的区别。白色表示未访问的
节点,黑色表示已经访问的节点,灰色表示:DFS中为正 在访问的节点、BFS中为已入队等待访问的节点。
宽度优先搜索(宽搜,BFS)
【输出数据】
输出数据仅一行,为从入口到出口的路径(有多条路径时输 出任意一条即可请严格按照 下 上 左 右)。路径格式参 见样例。
【样例输入】 4 0001 0100 0010 0110 【样例输出】(1,1)->(1,2)->(1,3)->(2,3)->(2,4)->(3,4)->(4,4)
void print(int dep)
if (s[j]=='0') dfs(dep+1,tx,ty);
c[i][j+1]=0;
}
else
c[i][j+1]=1;
}
}
dfs(1,1,1);
}
算法1:dfs 从左上角开始,找到下一个能走的路c[i][j]=0,然后dfs(i,j),(接着穷举
i,j)下一个点继续dfs,直到找到出口位置。
算法2:bfs(宽度优先搜索)_利用队列实现
为了标识队头和队尾,还要设置两个下标(指针)变量 front和rear,分别指向队列的头和尾。
周末舞会 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞
开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲只能 有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下 一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。 输入:
#include<iostream>
{
using namespace std;
int i;
const int dx[5]={0,1,-1,0,0};
for (i=1;i<dep;i++)
const int dy[5]={0,0,0,1,-1};
cout<<"("<<a[i]<<","<<b[i]<<")->";
int int
a[20],b[20];int n;
c[20][20];
} void
cout<<"("<<a[i]<<","<<b[i]<<")"<<endl; dfs(int dep,int x,int y)
int main()
{ int i,tx,ty;
{
a[dep]=x;
string s;
b[dep]=y;
队列的特点:先进队列的元素先出队列; 队列常说成先进先出线性表(FIFO,First In First Out); 类似于生活中排队购票:先来先买,后来后买。
队列的存储结构
在计算机中实现(存储)队列的最简单方法是用一维数 组;
若每个节点需要存储的不只一个数据,则可以把每个数 组元素的基类型设置为记录;或者定义成多个一维数组, 再或者定义成一个几行n列的二维数组;
int i,j;
c[x][y]=1;
cin>>n;
if(x==n&&y==n) print(dep);
for (i=1;i<=n;++i)
else for (i=1;i<=4;i++)
{ cin>>s;
{ tx=x+dx[i]; ty=y+dy[i];
for (j=0;j<s.length();++ifj)(tx>0&&tx<=n&&ty>0&&ty<=n&&c[tx][ty]==0)
输入:
3个整数m,n,k,分别表示男士人数、女士人数、几轮 舞曲。
输出:
各轮舞曲的配对方案。
输入样例: 246
如输果出k样很例大:, 1有1 什么缺点? 2怎2 么解决?
13 24 11 22
算法:模拟舞会配对 设计两个队列分别存放男士和女士
的编号,每次取出(出队)两个队列的 队头元素进行配对(输出),每对跳舞 的人一旦跳完后就回到队尾(入队)等 待下次被选。
队列的概念
队列和栈一样,也是一种特殊的线性表; 队列是一种运算受到限制的线性表,插入操作限定在表的
一端进行,称为“入队”,删除操作则限定在表的另一端 进行,称为“出队”; 插入一端称为队尾(rear),删除一端称为队头(front)。
出队
A1 A2 A3 A4 A5 A6
Leabharlann Baidu队头
队尾
入队 A7
队列的概念
3个整数m,n,k,分别表示男士人数、女士人数、几轮舞曲。 输出:
各轮舞曲的配对方案。
例、周末舞会
假设在周末舞会上,男士们和女士们进入舞厅时,各自排 成一队。跳舞开始时,依次从男队和女队的队头上各出一 人配成舞伴。规定每个舞曲只能有一对跳舞者。若两队初 始人数不相同,则较长的那一队中未配对者等待下一轮舞 曲。现要求写一个程序,模拟上述舞伴配对问题。
相关文档
最新文档