zoukankan      html  css  js  c++  java
  • 算法16 啊哈算法 广度优先搜索( Breadth First Search, BFS) 迷宫问题 JAVA

    广度优先:每一步都列出所有可能

    题目

    迷宫由n 行m 列的单元格组成( n 和m 都=<50 ) ,每个单元格要么是空地, 要么
    是障碍物。你的任务是帮助小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。注意
    障碍物是不能走的,当然小哼也不能走到迷宫之外。

    代码

    添加了个打印路线的功能
    输出如图

    简化为矩阵,障碍为1,终点为2.

    
    //图形矩阵,障碍物,终点最短步数
    /*
    00000
    00110
    01200
    00000
     */
    
    class Main{
        public static void main(String[] args) {
            int x,y,m_s=99;
    //队列 x,y,step
            int[] ax=new int[50];
            int[] ay=new int[50];//ay=ax;//que
            int[] as=new int[50];
    //set map
            int[][] map=new int[][]{{0,0,0,0,0},{0,0,1,1,0},{0,1,2,0,0},{0,0,0,0,0}};
    //walked places
            int [][] road=new int[4][5];
    //4ways-move
            int [][] walk=new int[][]{{0,1},{0,-1},{1,0},{-1,0}};//4ways-move
    //pointers
            int tail=1,head=0;
            
            for (;head<tail;) {//one point 4 ways
                for (int i = 0; i < 4; i++) {//head->tail
                    x = ax[head] + walk[i][0];
                    y = ay[head] + walk[i][1];
                    //越界
                    if (x > 3 || y > 4||x<0||y<0) {
                        continue;
                    }
    //check destination  
                    if (map[x][y] == 2&&as[tail-1]<m_s) {
                        m_s=as[tail-1];
                        //origin
                        plot(map,road);
                        System.out.println(as[tail-1]);
                        break;
                    }
                    if (road[x][y] == 1) {//走过
                        continue;
                    }
    
                    if ((x == 1 && (y == 2 || y == 3)) || (x == 2 && y == 1)) {//障碍
                        continue;
                    }
                    ax[tail] = x;
                    ay[tail] = y;
                    as[tail]=as[head]+1;//!!!!!!!!!!!!!!!
    
                    tail++;
                    road[x][y] = 1;
                }
                head++;
            }    }
    //添加了个打印路线的功能
        void plot(int map[][],int road[][]){
            for (int ix=0;ix<4;ix++){
                for (int j=0;j<5;j++){
                    System.out.print(map[ix][j]);
    
                }
                System.out.println();
            }
            System.out.println();
            //road
            for (int ix=0;ix<4;ix++){
                for (int j=0;j<5;j++){
                    System.out.print(road[ix][j]);
                }
                System.out.println();
            }
        }
    
    
    }
    
    
  • 相关阅读:
    Ubuntu下Geary安装
    (1)html初步--表格的使用
    MYSQL笔记
    三,springboot集成mybatis
    一台服务部署多个tomcat注意事项
    Apache和Tomcat整合(一个Apache 不同域名处理多个不同业务)
    linux 安装 apache
    linux笔记
    关联查询一张小表。对性能有影响吗(mysql)
    关于mysql的临时表并行的问题
  • 原文地址:https://www.cnblogs.com/impw/p/15536261.html
Copyright © 2011-2022 走看看