走出迷宫C++问题 求debug

求debug,先给题目描述
描述
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸,请你判断是否可以走出迷宫。

输入INPUT:
输入格式
第一行是两个整数n和m(1<=n,m<=50),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。

输入样例
3 3
S#T
.#.
. . .(小数点中间是不需要空格的,我为了过问问题的门槛才打了空格,要不然不让提交问题)

输出OUTPUT:
输出格式
如果能走出迷宫输出Yes,否则输出No。

输出样例
Yes

下面是我的代码求debug

#include <bits/stdc++.h>
using namespace std;
int m,n,ex,ey;
char a[1005][1005];
bool flag;
const int dx[]={-1,0,0,1},dy[]={0,-1,1,0};
void dsf(int x,int y){
  if(x==ex&&y==ey){
    flag=1;
    return;
  }
  a[x][y]='#';
  for(int i=0; i<4; i++){
    int nx=x+dx[i],ny=y+dy[i];
    if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]=='.')dsf(nx,ny);
    if(flag)return;
  }
  
}
int main(){
  int sx,sy;
  scanf("%d %d\n",&n,&m);
  for(int i=1; i<=n; i++){
    for(int j=1; j<=m; j++){
      scanf("%c",&a[i][j]);
      if(a[i][j]=='S'){
        sx=i;
        sy=j;
      }else if(a[i][j]=='T'){
        ex=i;
        ey=j;
      }
    }
    scanf("\n");
  }
  dsf(sx,sy);
  printf(flag? "Yes":"No");
return 0;
}

给你个正确的参考一下

#include <bits/stdc++.h>        //C++的万能头文件 
using namespace std;        //名空间 
int n,m,p[10008],q[10008],ans[108][108],qx,qy,zx,zy;        //不要钱的数组开大点
char a[108][108];        //用于存地图 
int xx[5]= {0,1,-1,0,0};        //方向x
int yy[5]= {0,0,0,1,-1};        //方向y
void bfs() {
    a[qx][qy]='#';        //设初始点为不可走
    ans[qx][qy]=0;        //初始点一步可以到
    int head=1;            //这个不用说
    int tail=1;            //这个也不用说
    p[1]=qx;        //把第一个位置的方向x加入队列
    q[1]=qy;        //把第一个位置的方向y加入队列
    while(head<=tail) {    //BFS扩展
        for(int i=1; i<=4; i++) {    //四个方向搜索
            int h=p[head]+xx[i];
            int l=q[head]+yy[i];
            if(a[h][l]!='#'&&h>=1&&l>=1&&h<=n&&l<=m) {
                a[h][l]='#';        //走过了,以防再走,所以设为不可走
                //cout<<h<<" "<<l<<endl;    //跟踪数据(检查时用)
                //system("pause");            //跟踪数据(检查时用)
                tail++;        //有几个神奇的小朋友要进队列了
                p[tail]=h;        //神奇的小朋友1号,(方向xq[tail]=l;        //神奇的小朋友2号,(方向y)
                ans[h][l]=ans[p[head]][q[head]]+1;        //把这个点的步数设为上一个点的步数+1
                if(h==zx&&l==zy) {    //判断是否到达终点
                    cout<<ans[h][l]<<endl;        //输出结果
                    return ;        //结束函数(易错点)
                }
            }
        }
        head++;        //头结点++(易错点)
    }
}
int main() {
    cin>>n>>m;        //输入长和宽
    /*下面是输入*/
    /*———————————————————*/
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            cin>>a[i][j];
            if(a[i][j]=='S')
            {
                qx=i;
                qy=j;
            }
            if(a[i][j]=='T')
            {
                zx=i;
                zy=j;
            }
        }
    }
    /*———————————————————*/
    /*上面是输入*/ 
    bfs();

    return 0;
}