bfs求最短路径

Posted rstz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bfs求最短路径相关的知识,希望对你有一定的参考价值。

好久没写搜索,到忘了,找了半个小时错误。

一开始又把题看错了,真服自己了。(认真审题)

技术图片


这题可以用excel写。but作为一个程序园,那就要使用灵魂操作


核心算法:bfs层次遍历


  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 string s[35];
  5 int vist[35][55];//标记 
  6 int disx[4] = {0, 0, -1, 1};
  7 int disy[4] = {1, -1, 0, 0};
  8 int minn = 2000;
  9 int cnt = 0;
 10 int main(){
 11 	memset(vist, -1, sizeof(vist));
 12 	for(int i = 0; i < 30; ++ i)
 13 		cin >> s[i];
 14 	queue<pair<int, pair<int, int>>> q;
 15 	for(int i = 0; i < 50; ++ i)
 16 		if(s[0][i] != ‘1‘)
 17 			q.push(make_pair(0, make_pair(0, i))), vist[0][i] = 0;
 18 
 19 	while(q.size()){
 20 
 21 		auto now = q.front();q.pop();
 22 		if(now.first >= minn) break;
 23 		for(int i = 0; i < 4; ++ i){
 24 			int ntx = now.second.first + disx[i];
 25 			int nty = now.second.second + disy[i];
 26 
 27 			if(ntx < 0 || ntx >= 30 || nty < 0 || nty >= 50)continue;
 28 			if(s[ntx][nty] == ‘1‘)continue;
 29 			if(vist[ntx][nty] != -1 && vist[ntx][nty] < now.first + 1)continue;
 30 			if(ntx == 29)
 31 			{
 32 				minn = now.first + 1; cnt ++;
 33 				cout << minn << endl;
 34 			}
 35 			q.push(make_pair(now.first + 1, make_pair(ntx, nty)));
 36 
 37 			vist[ntx][nty] = now.first + 1;/*1110111
 38 											 1100011
 39 											 1101011
 40 											 1100011
 41 											 1110111*/ //解决这种情况,防止少数 
 42 		}
 43 	}
 44 	cout << cnt << endl;
 45 	return 0;
 46 }
 47 
 48 
 49 



以上是关于bfs求最短路径的主要内容,如果未能解决你的问题,请参考以下文章

hdu1372 BFS求最短路径长度

UVa 1599 理想路径(反向BFS 求最短路径 )

迷宫的最短路径 (BFS)

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

最短路径——dijkstra算法(Java)

[M最短路] lc1129. 颜色交替的最短路径(bfs最短路+拆点+拆边+好题)