package maze;//利用栈 解决迷宫问题public class MyMaze {
public static int mg[][]={{1,1,1,1,1,1},//地图迷宫,其四周是为1的外框
                      {1,0,0,0,1,1},
                      {1,0,1,0,0,1},
                      {1,0,1,0,1,1},
                      {1,1,0,0,0,1},
                      {1,1,1,1,1,1}};
public static Point[] stack=new Point[1000];//栈
public static int top=-1;//栈顶指针
// public static int path[];//保存最短路径的数组
// public static int minLen;//最短路径长度。

public static int  mgPath(int xi,int yi,int xe,int ye){//探索路径为:(xi,yi)->(xe,ye)
int i=0,j=0,di=-1,find=0;
top++;
stack[top].i=xi;//??????????????????????
stack[top].j=yi;
stack[top].di=-1;//初始结点进栈
mg[1][1]=-1;
while(top>-1){//栈不为空时循环
i=stack[top].i;j=stack[top].j;di=stack[top].di;//取栈顶方块
if(i==xe&&j==ye){//找到了出口,输出路径
System.out.println("迷宫路径如下:");
for(int k=0;k<=top;k++){
System.out.println("("+stack[k].i+","+stack[k].j+")");
if((k+1)%5==0)//每输出五个方块后换一行
System.out.println();
}
return 1;
}
find=0;
while(di<4&&find==0){//找(i,j)方块下一个可走方块
di++;
switch(di){//方向规定按顺时针方向来探索
case 0: i=stack[top].i-1;j=stack[top].j;break;
case 1: i=stack[top].i;j=stack[top].j+1;break;
case 2: i=stack[top].i+1;j=stack[top].j;break;
case 3: i=stack[top].i;j=stack[top].j-1;break;
}
if(mg[i][j]==0)
find=1;//找到下一个可走相邻方块
}
if(find==1){//找到了一个可走的相邻方块
stack[top].di=di;//修改原栈顶元素的di值
top++;
stack[top].i=i;stack[top].j=j;stack[top].di=-1;
mg[i][j]=-1;//避免重复走到该方块,将其置为-1
}else{//没有相邻方块可走,则退栈。
mg[stack[top].i][stack[top].j]=0;//让该位置变为其他路径可走方块。
top--;//将该方块退栈
}
}

return 0;
}
     private class Point{//点的位置及方位
int i;
int j;//i,j为方块的行号,列号。
int di;//下一步可走相邻方位的方位号。

}
public static void main(String[] args) {
MyMaze.mgPath(1, 1, 4, 4);
}
}注:在标注???的地方出现空指针异常。这个空指针异常应该与我的算法没关系,可能是我的某个基础知识没能理解造成的,请明白人指点一下。麻烦您了

解决方案 »

  1.   

    这个简单啊 呵呵 public calss  tellme
    {
        public static void main (String [] args)
        {
           System.out.println("电脑,告诉我哪里出错啦吧");
        }
    }哈哈 开个小玩笑 老兄 这么晚了 早点休息啊 注意身体啊
      

  2.   

    public static Point[] stack=new Point[1000];//栈
    数组创建后,里面的的每个对象存的默认值,这个是对象,存的是null 比如int类型存的是0
    加上下面内容
    Point p=new Point();
    for(int i=0; i<1000; i++){
      stack[i]=p;
    }
    //下面在调用stack[top]对象就不会发生null point
      

  3.   

    我按三楼的做了,还有错误,是不是与static有关??