迷宫算法_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 迷宫算法

迷宫算法

 2015/5/11 0:46:45  Cb123456  程序员俱乐部  我要评论(0)
  • 摘要:迷宫算法:一、迷宫算法:对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论.二、设定迷宫:用简单的二维数组.其中'A'表示入口,'B'表示出口,'#'表示不通,'.'表示可以移动char[][]maze={{'#','#','#','#','B','#','#','#','#','#','#','#'},{'#','#','#','#','.','.','.','.','#','#','#','#'},{'#','#','#','#','.','#','#','#','#','
  • 标签:算法

?迷宫算法:

?

?一、迷宫算法:

?对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论.

?

?二、设定迷宫:用简单的二维数组.其中'A'表示入口,'B'表示出

?

口,'#'表示不通, '.'表示可以移动

?

class="java" name="code">char[][] maze =

    {{'#','#','#','#','B','#','#','#','#','#','#','#'},

    {'#','#','#','#','.','.','.','.','#','#','#','#'},

    {'#','#','#','#','.','#','#','#','#','.','.','#'},

    {'#','.','.','.','.','#','#','#','#','#','.','#'},

    {'#','.','#','#','#','#','#','.','#','#','.','#'},

    {'#','.','#','#','#','#','#','.','#','#','.','#'},

    {'#','.','#','#','.','.','.','.','.','.','.','#'},

    {'#','.','#','#','.','#','#','#','.','#','.','#'},

    {'#','.','.','.','.','#','#','#','.','#','.','#'},

    {'#','#','.','#','.','#','#','#','.','#','.','A'},

    {'#','#','.','#','#','#','.','.','.','#','#','#'},

    {'#','#','#','#','#','#','#','#','#','#','#','#'}};

?

?

? ? ?

?

? 三、设定一个cell类,用来描述迷宫中的每个小格子

?

class Cell//内部类

    {

        private int row;//迷宫中小格子的行
        private int col;//迷宫中小格子的列
        private Cell from;//指向父节点
        public Cell(int row, int col, Cell from)

        {
            this.row = row;
            this.col = col;
            this.from = from;

        }

    }

?

?

?四、开始遍历:

?

public void resolve()

    
    {   
    	

        Set<Cell> set = new HashSet<Cell>();

        set.add(new Cell(9,11,null)); 
        for(;;)

        {
            Set<Cell> set1 = new HashSet<Cell>();
            Cell a = colorCell(set, set1);

            if(a!=null)

            {

                while(a!=null)//这样啊,此时的a就是出口的点.

                {

                	
                    maze[a.row][a.col] = '+';//标出通路路径

                    a =a.from;//并把当前节点的父节点,标记为+
                    

                }
                
                maze[9][11] = 'A';

                break;

            }
            set = set1;

        }      

    }

? ? ??给定开始点(9,11,null),也就是A的坐标,而且A是没有父类的,所以A的父节点为null,其中colorCell(set,set1),是为了得到当前给定cell周围的cell是不是通的,如果是通的,就把这个cell加到set里面,同时记录这个cell的父节点,然后在遍历这个set,一直到出口为止。

?

?

?五、输出结果.

?由第四步得到的set,也就是一条从入口到出口的cell的集合,通过cell.from不断得到后一个cell的前一个cell,这样路径就得到了,

?

?

?六、完整示例:

package sss;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class MiGongSuanFa

{
   
	boolean ifFirst=false;
    class Cell//内部类

    {

        private int row;//迷宫中小格子的行
        private int col;//迷宫中小格子的列
        private Cell from;//指向父节点
        public Cell(int row, int col, Cell from)

        {
            this.row = row;
            this.col = col;
            this.from = from;

        }

    }

       

    char[][] maze =

    {{'#','#','#','#','B','#','#','#','#','#','#','#'},

    {'#','#','#','#','.','.','.','.','#','#','#','#'},

    {'#','#','#','#','.','#','#','#','#','.','.','#'},

    {'#','.','.','.','.','#','#','#','#','#','.','#'},

    {'#','.','#','#','#','#','#','.','#','#','.','#'},

    {'#','.','#','#','#','#','#','.','#','#','.','#'},

    {'#','.','#','#','.','.','.','.','.','.','.','#'},

    {'#','.','#','#','.','#','#','#','.','#','.','#'},

    {'#','.','.','.','.','#','#','#','.','#','.','#'},

    {'#','#','.','#','.','#','#','#','.','#','.','A'},

    {'#','#','.','#','#','#','.','.','.','#','#','#'},

    {'#','#','#','#','#','#','#','#','#','#','#','#'}};

   

    public void show()

    {
    	if (!ifFirst) {
    		System.out.println("生成的迷宫:");
    		ifFirst=true;
		}else{
			
			System.out.println("找到的道路是:");
			ifFirst=false;
			
		}
        
        for(int i=0; i<maze.length; i++)

        {

            for(int j=0; j<maze[i].length; j++)

       System.out.print(" " + maze[i][j]);

            System.out.println();

        }

    }

   

    //把与from集合中相邻的可染色节点染色,被染色节点记入 dest

    //一旦发现出口将被染色,则返回当前的“传播源”节点

    public Cell colorCell(Set<Cell> from, Set<Cell> dest)

    {    
        
        

        Iterator<Cell> it = from.iterator();

        while(it.hasNext())

        {   

            Cell a = it.next();

            Cell[] c = new Cell[4];

            c[0] = new Cell(a.row-1, a.col, a); //向上

            c[1] = new Cell(a.row, a.col-1, a); //向左

            c[2] = new Cell(a.row+1, a.col, a); //向下

            c[3] = new  Cell(a.row, a.col+1, a); //向右

                       

            //遍历4个孩子
            for(int i=0; i<4; i++)

            {

                if(c[i].row < 0 || c[i].row >= maze.length)continue;

                if(c[i].col < 0 || c[i].col >= maze[0].length)continue;

               

                char x = maze[c[i].row][c[i].col];

                if(x=='B') return a;

                if(x=='.')

                {

                    maze[c[i].row][c[i].col] = '?';//对可通过路径进行标记
                   
                    dest.add(c[i]);
                    

                }

            }
            
        }
       
        return null;

    }

   

    public void resolve()

    
    {   
    	

        Set<Cell> set = new HashSet<Cell>();

        set.add(new Cell(9,11,null)); 
        for(;;)

        {
            Set<Cell> set1 = new HashSet<Cell>();
            Cell a = colorCell(set, set1);

            if(a!=null)

            {

                while(a!=null)//这样啊,此时的a就是出口的点.

                {

                	
                    maze[a.row][a.col] = '+';//标出通路路径

                    a =a.from;//并把当前节点的父节点,标记为+
                    

                }
                
                maze[9][11] = 'A';

                break;

            }
            set = set1;

        }      

    }

   

    public static void main(String[] args)

    {

        MiGongSuanFa m = new MiGongSuanFa();

        m.show();

        m.resolve();

        m.show();  

    }

}

?

?

?

?七、运行效果:


?

?

?八、总结:

?总的来说,就是通过给定的点,不断遍历,得到周围可以移动的点的集合,同时记录这些点的父节点,一直遍历到出口,就遍历结束,通过出口的点得到出口的前一个点,在通过出口前一个点,得到出口前一个点的点....就这样一直到入口,这样就得到路径了。

?

  • 大小: 37.4 KB
  • 查看图片附件
发表评论
用户名: 匿名