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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM