计蒜客--T1597--迷宫进阶

经过思考蒜头君终于解决了怎么计算一个迷宫的最短路问题,于是蒜头君找到一个新的迷宫图,来验证自己是否真的会计算一个迷宫的最短路。

为了检验自己计算的是否正确,蒜头君特邀你一起来计算。

输入格式

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

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

输出格式

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

数据范围

1 \le n,m \le 151≤n,m≤15。

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

样例输入1
9 13
#############
#@..........#
#####.#.#.#.#
#...........#
#.#.#.#.#.#.#
#.#.......#.#
#.#.#.#.#.#.#
#...........#
#####.#######
样例输出1
11
样例输入2
4 6
#.####
#.#.##
#...@#
######
样例输出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 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();
		//四个方向循环
		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;
			}
			//判断出口 
			if(maze[nx][ny]=='.'&&(nx==N-1||nx==0||ny==M-1||ny==0))
				return d[nx][ny]; 
		} 	
	}
	return INF;
} 
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]=='@'){
					sx=i;sy=j;
					break;
				}
		if(bfs()>=INF)	printf("-1\n");
		else	printf("%d\n",bfs());
	} 
	return 0;
}
发布了226 篇原创文章 · 获赞 90 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/queque_heiya/article/details/105217024