计蒜客--T1596--迷宫最小步数

蒜头君在你的帮助下终于逃出了迷宫,但是蒜头君并没有沉浸于喜悦之中,而是很快的又陷入了思考,从这个迷宫逃出的最少步数是多少呢?

输入格式

第一行输入两个整数 nn 和 mm,表示这是一个 n \times mn×m 的迷宫。

接下来的输入一个 nn 行 mm 列的迷宫。其中 'S' 表示蒜头君的位置,'*'表示墙,蒜头君无法通过,'.'表示路,蒜头君可以通过'.'移动,'T'表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。

输出格式

输出整数,表示蒜头君逃出迷宫的最少步数,如果蒜头君无法逃出迷宫输出 -1−1。

数据范围

1 \le n, m \le 101≤n,m≤10。

输出时每行末尾的多余空格,不影响答案正确性

样例输入1
3 4
S**.
..*.
***T
样例输出1
-1
样例输入2
3 4
S**.
....
***T
样例输出2
5
#include<queue>
#include<iostream>
using namespace std;
#include<algorithm> 
const int INF=1e9;
const int MAX=1000+10;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
typedef pair<int,int> P;
char maze[MAX][MAX];
int N,M;
int sx,sy;//起点
int gx,gy;//终点
int d[MAX][MAX];//到各个位置最短距离的数组
int bfs(){
	queue<P>que;
	for(int i=0;i<N;i++)
		for(int j=0;j<M;j++)
			d[i][j]=INF;
	que.push(P(sx,sy));
	d[sx][sy]=0;
	while(que.size()){
		P p=que.front();
		que.pop();
		if(p.first==gx&&p.second==gy)
			break;//终点结束
		//四个方向循环
		for(int i=0;i<4;i++){
			int nx=p.first+dx[i],ny=p.second+dy[i];
			//判断check
			if(nx>=0&&ny>=0&&nx<N&&ny<M&&maze[nx][ny]!='*'&&d[nx][ny]==INF){
				que.push(P(nx,ny));
				d[nx][ny]=d[p.first][p.second]+1;
			} 
		} 	
	}
	return d[gx][gy];
} 
int main(){
	while(~scanf("%d%d",&N,&M)){
		for(int i=0;i<N;i++)
			scanf("%s",maze[i]);
		for(int i=0;i<N;i++)
			for(int j=0;j<M;j++)
				if(maze[i][j]=='S'){
					sx=i;sy=j;
				}
				else if(maze[i][j]=='T'){
					gx=i;gy=j;
				}
		if(bfs()>=INF)	printf("-1\n");
		else	printf("%d\n",bfs());
	} 
	return 0;
}
发布了226 篇原创文章 · 获赞 90 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/queque_heiya/article/details/105216992
今日推荐