测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A39804. 走出迷宫

填空题 困难

题目描述

走出迷宫

题目描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入

第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。

输出

输出从起点到出口最少需要走的步数。

样例输入

3 3

S#T

.#.

...

样例输出

6

参考答案

#include<bits/stdc++.h> #define max 110 int front,rear,m,n,dx[4]= { 0,1,0,-1 } ,dy[4]= { 1,0,-1,0 } ,q[max*max][3],s1,s2,t1,t2; char a[max][max]; void bfs(); int main() { scanf("%d %d",&m,&n); //输入并保存信息 getchar(); if(m==0&&n==0) return 0; for (int i=1;i<=m;i++) { for (int j=1;j<=n;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='S') s1=i,s2=j; if(a[i][j]=='T') t1=i,t2=j; } getchar(); } front=0,rear=1; q[rear][0]=s1,q[rear][1]=s2,q[rear][2]=0; //标记走到哪里了以及走了几步 a[s1][s2]=1; bfs(); printf("%d",q[rear][2]); return 0; } void bfs() { while(front<rear) { front++; for (int i=0;i<4;i++) { int xx=q[front][0]+dx[i]; int yy=q[front][1]+dy[i]; if(xx>=1&&xx<=m&&yy>=1&&yy<=n&&a[xx][yy]!='#') //判断是否越界或撞墙 { rear++; q[rear][0]=xx; //向四周前进 q[rear][1]=yy; q[rear][2]=q[front][2]+1; a[xx][yy]='#'; //将原路封住来等效于不可往回走 if(xx==t1&&yy==t2) //找到出口,离开函数 return; } } } }
上一题 下一题