bfs求最短路径

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

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

@XKFERA9UU544E3~M53F2NE


这题可以用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 
追求吾之所爱
原文地址:https://www.cnblogs.com/rstz/p/14391073.html