题意:给一个n*m的二维数组,S表示入口,T表示出口,*点表示墙不可达,. 表示路可达。
求S走到到T的最短距离。
输入样例:
5 6
....S*
.**...
.*..*.
*..**.
.T....
输出样例:
7
#include <cstdio> #include <string.h> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> #include <queue> using namespace std; const int inf=0x7fffffff; const long long mod=1e9+7; const double PI=acos(-1); int n,m; int ans; bool vis[105][105]; char a[105][105]; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四个方向 bool in(int x,int y){ return x>=0&&x<n&&y>=0&&y<m; } struct node{ int x,y,d; node(int xx,int yy,int dd){ x=xx; y=yy; d=dd; } }; int bfs(int sx,int sy){ queue<node> q; q.push(node(sx,sy,0)); vis[sx][sy]=1; while(!q.empty()){ //bfs核心就是不断出队入队 node now = q.front(); q.pop(); for(int i=0;i<4;i++){ //依此遍历每个节点的四个方向 int tx=now.x+next[i][0]; int ty=now.y+next[i][1]; if(in(tx,ty)&&a[tx][ty]!='*'&&!vis[tx][ty]){ if(a[tx][ty]=='T'){ //找到出口 返回 return now.d+1; } else{ //非出口 将该节点入队 vis[tx][ty]=1; q.push(node(tx,ty,now.d+1)); } } } } return -1; } int main() { cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; } } int x,y; for(int i=0;i<n;i++){ //找入口 for(int j=0;j<m;j++){ if(a[i][j]=='S') x=i,y=j; } } cout<<bfs(x,y); return 0; }