码迷,mamicode.com
首页 > 编程语言 > 详细

回溯算法求解迷宫问题

时间:2015-08-03 01:06:59      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

package sort;

public class HuiSu {
    public static void main(String args[]){
        int data[][]={{1,1,1,1,1,1,1,1,1},  //10行9列的迷宫
                      {0,0,0,0,0,0,0,0,1},
                      {1,0,1,0,0,1,1,0,1},
                      {1,0,0,1,0,1,0,0,1},
                      {1,1,0,1,0,0,1,0,1},
                      {1,0,0,0,1,0,1,0,1},
                      {1,0,1,1,0,0,1,0,1},
                      {1,0,0,0,1,1,0,1,1},
                      {1,0,1,0,0,0,0,0,0},
                      {1,1,1,1,1,1,1,1,1}};
        int fx[][]={{0,1},{1,0},{0,-1},{-1,0}};  //代表右下左上四个方向
        int x=1,y=0,p=0,i=0;  //x是x轴上的坐标,y是y轴上的坐标,p是步数
        int xx[]=new int[90];  //记录每一步的x坐标
        int yy[]=new int[90];  //记录每一步的y坐标
        int ss[]=new int[90];  //记录每一点走了几个方向,如果等于4,表示所有方向都走完
        for(int j=0;j<90;j++){  //初始化三个数组
            xx[j]=0;
            yy[j]=0;
            ss[j]=0;
        }
        xx[p]=x;  //x=1表示入口从第二行开始
        yy[p]=y;
        while(x>=0 && x<=9 && y>=0 && y<=8){  //在图的范围内循环
            i=i+1;  //i表示四个方向,加1是下个方向
            if(i<=4){  //如果四个方向还没走完,指针向右;i=2时,指针向下;i=3时,指针向左;i=4时,指针向上
                x=xx[p]+fx[i-1][0];  //x方向上坐标移动
                y=yy[p]+fx[i-1][1];  //y方向上坐标移动
                if(x==1 && y==0){
                    i++;
                    x=xx[p]+fx[i-1][0];  //x方向上坐标移动
                    y=yy[p]+fx[i-1][1];  //y方向上坐标移动
                }
                if(x>=0 && x<=9 && y>=0 && y<=8){  //如果x和y方向上没有超出边界
                    if(data[x][y]==0){  //如果下一个点没有障碍点
                        p++;  //步数增加
                        ss[p]=i;  //记录四个方向中已经走了的方向
                        xx[p]=x;  //记录x坐标
                        yy[p]=y;  //记录y坐标
                        data[x][y]=2;  //2表示该点已走过
                        
                        
//                        System.out.println("向方向"+ss[p]+"上走,坐标为("+xx[p]+","+yy[p]+"),第"+p+"步后数组结果;");
//                        for(int t=0;t<10;t++){
//                            for(int m=0;m<9;m++)
//                                System.out.print(data[t][m]+" ");
//                            System.out.println();
//                        }
                        
                        
                        i=0;  //该点可以到达,将i置为0,重新搜索该点的4个方向
                    }
                }
            }else{  //否则,该点的四个方向已经走完,且无法继续往下走,则退回
                i=ss[p];  //退回后,取出原来已走的方向
                p--;  //退回后,步数也要相应减1
                
//                System.out.println("返回第"+p+"步,原方向是:"+i+",坐标是:("+xx[p]+","+yy[p]+")");
                
            }
        }
        if(p<=0)
            System.out.println("无法通过!");  //p=0表示又回到入口,无路径可走
        else{  //否则,说明已有路径,将路径输出
            System.out.print("运行路线:入口:(1,0)-->");
            for(int k=1;k<=p;k++)
                System.out.print("("+xx[k]+","+yy[k]+")-->");
            System.out.println("出口。");
        }
    }

}

 

回溯算法求解迷宫问题

标签:

原文地址:http://www.cnblogs.com/lvbubu/p/4697078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!