给定一个大小为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