问题 E: 迷宫问题
时间限制: 1 Sec 内存限制: 32 MB
提交: 675 解决: 197
[提交][状态][讨论版]
题目描述
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。
输入
输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
输出
对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。
样例输入
1
5 5
s-###
#----
##—
E#—
—##
样例输出
9
#include
#include
#include //cstdio是将stdio.h的内容用C++头文件的形式表示出来
#define unDebug //文件输入 用于检测的 避免不断粘贴 上下两个都是时Debug有效
using namespace std;
int sx,sy,ex,ey,nx,ny;
int sum;
int n,m;
char a[110][110];
int b[110][110];
int h,t,k;
struct node //记录所在位置
{
int x;
int y;
int step;
};
node se[10000]; //结构体坐标
int main()
{
#ifdef Debug //文件输入 用于检测的 避免不断粘贴 Debug 时有效
freopen("in.txt", "r", stdin);
#endif // Debug
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //四个探索方向
cin>>sum;
while(sum--)
{
memset(b,0,sizeof(b));
memset(se,0,sizeof(se));//清空原来的数据 并以0填满
cin>>n>>m;
for(int i=0;i>a[i][j];
if(a[i][j]=='S') //记录起点
{
sx=i;
sy=j;
}
if(a[i][j]=='E') //记录终点
{
ex=i;
ey=j;
}
}
} //输入
b[sx][sy]=1; //起点坐标
h=1;
t=1;
k=0;
se[t].x=sx;
se[t].y=sy;
se[t].step=0;
t++; //定义
while(h=n||nx<0||ny<0||ny>=m){continue;} //过界判定
if(!b[nx][ny]&&a[nx][ny]!='#') //可以通过且未探索过 每个点探索过就会被标记 即b[][]=1
{
b[nx][ny]=1;
se[t].x=nx;
se[t].y=ny;
se[t].step=se[h].step+1; //记录步数 实际是从起点开始把周围所有可以通过的点 进行遍历
t++;
}
if(ex==nx&&ey==ny){k=1;break;}
}
if(k==1) // 找到终点就不管了 因为此时步数最短
{
break;
}
h++;
}
if(k==0){cout<<-1<
#define A
#ifdef B //A和B相同时
freopen(“in.txt”,“r”,stdin);
#endif
函数名:freopen
freopen(“path”,“mode”,stream)
参数说明:
path: 文件名。
mode: 文件打开的模式。和fopen中的模式(如r, w,)相同。//read write
stream: 一个文件,通常使用标准流文件(stdin, stdout, stderr)。//估计类似输入cin 输出cout 输出cerr
返回值:成功,则返回一个path所指定的文件的指针。失败,返回NULL。(一般都不使用它的返回值)
功能:实现重定向。把预定义的几个标准流文件(stdin, stdout, stderr)定向到由path指定的文件中。
freopen(“debug\in.txt”,“r”,stdin)的作用就是把stdin重定向到debug\in.txt文件中,这样在用cin或是
用scanf输入时便不会从标准输入流提取数据。而是从in.txt文件中获取输入。