【题目描述】当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。 接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】输出从起点到出口最少需要走的步数。 【输入样例】3 3 S#T .#. ... 【输出样例】6 |
#include <cstdio> #include <cstring> #include<cmath> #include<algorithm> #include<iostream> #include<queue> #define P pair<int,int> using namespace std; char a[105][105]; int dx[5]={-1,1,0,0}; int dy[5]={0,0,1,-1}; int d[105][105],n,m; int bfs(int x,int y) { int ex,ey; //memset(d,0,sizeof(d)); queue <P> que; que.push(P(x,y)); while(que.size()>0) { ex=que.front().first; ey=que.front().second; que.pop(); if(a[ex][ey]=='T') { return d[ex][ey]; break; } for(int i=0;i<4;i++) { int nx=ex+dx[i]; int ny=ey+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&(a[nx][ny]=='.'||a[nx][ny]=='T')&&d[nx][ny]==0) { que.push(P(nx,ny)); d[nx][ny]=d[ex][ey]+1; } } } return d[ex][ey]; } int main() { int x; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cin>>a[i][j]; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) if(a[i][j]=='S') x=bfs(i,j); } cout<<x<<endl; return 0; }