这段程序提示Runtime Error(ACCESS_VIOLATION),求助,为什么

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<stack>
#define MAXN 40010
using namespace std;
int a[210][210];
int n,m;
struct Point{
    int x,y;
};
int x1,y1,x2,y2;
int l;
stack<Point>sta;
int vis[210][210];
int stepx[210];
int stepy[210];
int judge(int xx,int yy)
{

    if(xx<0||yy<0||xx>=n||yy>=m)
        return 0;
    if(a[xx][yy]==0)
        return 0;
    return 1;
}
int bfs(int sx,int sy,int ex,int ey)
{
    if(sx==ex&&sy==ey)
    {
        return vis[sx][sy];
    }
    else
    {
        int firstx=0,firsty=0;
        int lastx=0,lasty=0;
        stepx[firstx++]=sx;
        stepy[firsty++]=sy;
        while(1)
        {
            int xs=stepx[lastx++];
            int ys=stepy[lasty++];
            if(xs==ex&&ys==ey)
                return vis[xs][ys];
            if(judge(xs+1,ys)&&(!vis[xs+1][ys]))
            {
                vis[xs+1][ys]=vis[xs][ys]+1;
                stepx[firstx++]=xs+1;
                stepy[firsty++]=ys;
            }
             if(judge(xs-1,ys)&&(!vis[xs-1][ys]))
            {
                vis[xs-1][ys]=vis[xs][ys]+1;
                stepx[firstx++]=xs-1;
                stepy[firsty++]=ys;
            }
             if(judge(xs,ys+1)&&(!vis[xs][ys+1]))
            {
                vis[xs][ys+1]=vis[xs][ys]+1;
                stepx[firstx++]=xs;
                stepy[firsty++]=ys+1;
            }
             if(judge(xs,ys-1)&&(!vis[xs][ys-1]))
            {
                vis[xs][ys-1]=vis[xs][ys]+1;
                stepx[firstx++]=xs;
                stepy[firsty++]=ys-1;
            }
        }
    }
}
char s[210][210];
int main()
{
    while(scanf("%d %d",&n,&m)==2)
    {
        memset(s,0,sizeof(s));
        memset(a,0,sizeof(a));
        memset(stepx,0,sizeof(stepx));
        memset(stepy,0,sizeof(stepy));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;++i)
          scanf("%s",s[i]);
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<m;++j)
            {
                if(s[i][j]=='Y')
                {
                    a[i][j]=3;
                    x1=i;
                    y1=j;
                }
                if(s[i][j]=='M')
                {
                    a[i][j]=4;
                    x2=i;
                    y2=j;
                }
                if(s[i][j]=='#')
                {
                    a[i][j]=0;
                }
                if(s[i][j]=='.')
                {
                    a[i][j]=1;
                }
                if(s[i][j]=='@')
                {
                    a[i][j]=5;
                    Point p;
                    p.x=i;
                    p.y=j;
                    sta.push(p);
                }
            }
        }
        l=MAXN;
        while(!sta.empty())
        {   int x3=sta.top().x;
            int y3=sta.top().y;
           // memset(a,0,sizeof(a));
        memset(stepx,0,sizeof(stepx));
        memset(stepy,0,sizeof(stepy));
        memset(vis,0,sizeof(vis));
            int l1=bfs(x1,y1,x3,y3);
           // memset(a,0,sizeof(a));
        memset(stepx,0,sizeof(stepx));
        memset(stepy,0,sizeof(stepy));
        memset(vis,0,sizeof(vis));
            int l2=bfs(x2,y2,x3,y3);
            sta.pop();
            if(l1+l2<l)
                l=l1+l2;
        }
        printf("%d\n",l*11);
    }
    return 0;
}

调试下,而不是直接运行,看出现错误的行,检查指针是否为野指针或者尝试修改常量等情况

简单了测试没有问题。。。代码可以正常运行。。。VS2008 SP1