迷宫问题 BFS

问题 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文件中获取输入。

你可能感兴趣的:(c++程序)