迷宫BFS

匿名 (未验证) 提交于 2019-12-02 23:32:01

给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。如果不能到达,输出“不能走到那里”。(N,M<=50,起点,终点分别用S,G表示)

输入样例:N=5,M=5 #S### ..##. #.### ..### ..G##   输出:5 
//#include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <stdio.h> #include <string> #include <map> #include <set> #include <vector> #include <queue> #include <list> #include <sstream> #include <algorithm> #include <cstring> #include <iomanip> #include <cmath> using namespace std;  const int maxn = 100 + 10; int n,m; int sx,sy,ex,ey; int dx[]={1,0,-1,0};  int dy[]={0,1,0,-1}; char mg[maxn][maxn]; bool vis[maxn][maxn];   struct node { 	int x,y; 	int step; }; void bfs() { 	node p; 	p.x = sx; p.y = sy; 	p.step = 0; 	queue<node> q; 	q.push(p); 	vis[sx][sy]=1; 	while(!q.empty()) 	{ 		node tmp = q.front(); 		q.pop(); 		if(tmp.x == ex && tmp.y == ey) 		{ 			cout<<"最短路径:"<<tmp.step<<endl; 			return;  		} 		for(int i=0;i<4;i++) 		{ 			int xx = tmp.x + dx[i]; 			int yy = tmp.y + dy[i]; 			if(mg[xx][yy]!='#'&&xx>0&&yy>0&&xx<=n&&yy<=m&&!vis[xx][yy]) 			{ 				node tp; 				tp.x = xx; 				tp.y = yy; 				tp.step = tmp.step + 1; 				vis[xx][yy] = 1; 				q.push(tp); 			}	 		} 	} 	cout<<"不能走到耶。\n"; }  int main()  { 	while(scanf("%d%d",&n,&m) == 2 && n && m) 	{ 		memset(vis,0,sizeof(vis)); 		for(int i=1;i<=n;i++) 		{ 			for(int j=1;j<=m;j++) 			{ 				cin>>mg[i][j]; 				if(mg[i][j]=='S') 					{sx=i;sy=j;} 				else if(mg[i][j]=='G') 					{ex=i;ey=j;} 			}	 		} 		bfs(); 	} } 
文章来源: https://blog.csdn.net/weixin_43479989/article/details/90245506
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!