bfs退出条件

 

找到结果即退出?

Possibly Not!

如拓展(x)将导致距离增加0(x)或1(x+1),[这种情况用优先队列]

那么该拓展得到的结果也许并不是最优的,后面还有x。

所以最好的是遍历(不知怎么说)到满足条件的结果才退出,或者遍历到距离第一次大于最优解(x->x+1 x+1>minresult=x)时退出。

转载于:https://www.cnblogs.com/cmyg/p/9927213.html

好的,下面是完整代码: ``` #include <iostream> #include <queue> using namespace std; int a[100][100]; int v[100][100]; struct point { int x, y, step; }; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; bool readMap(int size_x, int size_y) { for (int i = 0; i < size_x; i++) { for (int j = 0; j < size_y; j++) { cin >> a[i][j]; } } return true; } int main() { int n, m, startx, starty, p, q; cin >> n >> m >> startx >> starty >> p >> q; readMap(n, m); point start = {startx, starty, 0}; v[startx][starty] = 1; queue<point> q; q.push(start); int flag = 0; while (!q.empty()) { point now = q.front(); q.pop(); if (now.x == p && now.y == q) { cout << now.step << endl; flag = 1; break; } for (int i = 0; i < 4; i++) { int tx = now.x + dx[i]; int ty = now.y + dy[i]; if (tx < 0 || tx >= n || ty < 0 || ty >= m) { continue; } if (a[tx][ty] == 1 && v[tx][ty] == 0) { point temp = {tx, ty, now.step + 1}; q.push(temp); v[tx][ty] = 1; } } } if (flag == 0) { cout << "No path found!" << endl; } return 0; } ``` 在代码中,我们使用了BFS算法来找到起点到终点的最短路径。具体流程如下: 1. 首先读入地图数据,保存在二维数组a中。 2. 定义起点start,将其标记为已访问。 3. 将起点start加入队列q中。 4. 当队列不为空时,取出队首元素now。 5. 如果现在的点now是终点,则输出最短路径长度,标记flag为1,退出循环。 6. 否则,枚举四个方向,如果可行且未访问过,则将其加入队列q中,标记为已访问。 7. 如果队列为空且flag为0,则说明没有找到路径,输出"No path found!"。 需要注意的是,在代码中有三个填空部分,分别是: 1. 队列q的push操作,应该将起点start加入队列中。 2. 判断是否到达终点的条件,应该判断x和y是否都等于终点的坐标。 3. 将新的点加入队列q中时,应该使用push操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值