作业介绍
前置课程:
第37课结构体、第41课队列
BFS 全称是 [Breadth First Search],中文名是宽度优先搜索,也叫广度优先搜索。
是图上最基础、最重要的搜索算法之一。
所谓宽度优先。就是每次都尝试访问同一层的节点。 如果同一层都访问完了,再访问下一层。
这样做的结果是,BFS 算法找到的路径是从起点开始的 最短 合法路径。换言之,这条路径所包含的边数最小。
在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。
1.故事起源
有一只蚂蚁出去寻找食物,无意中进入了一个迷宫。蚂蚁只能向上、下、左、右4个方向走,迷宫中有墙和水的地方都无法通行。这时蚂蚁犯难了,怎样才能找出到食物的最短路径呢?
2.思考 蚂蚁在起点时,有4个选择,可以向上、下、左、右某一个方向走1步。
如果蚂蚁走过了一段距离,此时也依然只有4个选择。 当然要排除之前走过的地方(不走回头路,走了也只会更长)和无法通过的墙和水。
蚂蚁想,还好我会影分身。如果每一步都分身成4个蚂蚁,向4个方向各走1步,这样最先找到食物的肯定就是最短的路径了(因为每一步都把能走的地方都走完了,肯定找不出更短的路径了)。
而且还能看出,第1步会到达所有到起点距离为1的地方,第2步也会到达所有距离为2的地方。 如此类推,第n步会覆盖所有到起点最短距离为n的地方。
3.问题建模 把迷宫地图放在二维数组中,能通行的地方为0,墙和水的地方为负数。
每一步向4个方向走,可以通过当前坐标(x,y)加上一个方向向量。
这个其实就是宽度优先搜索(BFS)的思想。
4.宽度优先搜索(BFS) 又称广度优先搜索,优先向四周扩展子节点,是最简便的图的搜索算法之一,一般通过队列来实现。
int n,m;//一般输入的行列数/边界
struct node{
int x, y, s;
};//保存点的信息
int dx[]={};//x方向
int dy[]={};//y方向
int vis[n][m],mapp[N][N];//vis初始化应该在主函数
int BFS(int x,int y)
{
//起点特判,也可以在主函数中特判
if(x == endx && y == endy)//满足条件
{
return 1;
}
queue<node> q;
q.push({x, y, 1});//将起始点先放进队列
vis[x][y] = 1;//标记起始点
while(!q.empty())//队列非空表示有路径可搜
{
int tx = q.front().x;
int ty = q.front().y;
int ts = q.front().s;//取出队首的点
q.pop();//将队首抛弃
for()
{
int xx = tx + dx[];
int yy = ty + dy[];
if(xx == endx && yy == endy)//满足条件
{
return ts + 1;
}
//判断是否在边界内,是否不可搜索,是否曾搜索过
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy])
{
vis[xx][yy] = 1;
q.push({xx, yy, ts + 1});//将新的可搜点放进队列
}
}
}
return -1;//如果搜不到
}
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 13
- 开始时间
- 2025-1-9 0:00
- 截止时间
- 3333-5-1 23:59
- 可延期
- 24 小时