• bfs_迷宫求最短路径


    宽度优先搜索按照距离开始状态由近及远的顺序进行搜索,可以很容易用来求解最短路径或者最少操作等问题。

    将已经访问过的状态用标记管理起来,便可以很好地做到由近及远的搜索。

    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class Main {
        static int n,m;
        static char[][] maze;
        static int [][] dis;
        final static int INF = 100000000;
        static int gx,gy;
        static int sx,sy;
        
        static int dx[] = new int[]{1,0,-1,0};
        static int dy[] = new int[]{0,1,0,-1};
        
        static int bfs(){
            
            Queue<Pair> queue = new LinkedList();
            
            for(int i = 0; i < n; i++){
                for(int j = 0; j < m; j++)
                    dis[i][j] = INF;
            }
    
            queue.add(new Pair(sx,sy));
            dis[sx][sy] = 0;
            
            while(!queue.isEmpty()){
                Pair p = queue.remove();
                System.out.println(p.x + " "+ p.y);
                if(p.x == gx && p.y == gy) break;
                
                for(int i = 0; i < 4; i++){
                    int nx = p.x + dx[i]; 
                    int ny = p.y + dy[i];
                    if(0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny] != '#' && dis[nx][ny] == INF){
                        queue.add(new Pair(nx,ny));
                        dis[nx][ny] = dis[p.x][p.y] + 1;
                    }    
                }
            }
            
            return dis[gx][gy];
        
        }
        
    
        public static void main(String[] args) {
            
            Scanner in = new Scanner(System.in);
            n = in.nextInt();
            m = in.nextInt();
            maze = new char[n][m];
            dis = new int[n][m];
            
            for(int i = 0; i < n; i++){
                for(int j = 0; j < m; j++){
                    maze[i][j] = in.next().charAt(0);
                    if(maze[i][j] == 'S'){
                        sx = i;
                        sy = j;
                    }
                    if(maze[i][j] == 'G'){
                        gx = i;
                        gy = j;
                    }
                }
                    
            }
            
            
            System.out.println(bfs());
            
            
        
    
    
        }
    
    }
    
    
    class Pair{
        public Pair(int x, int y){
            this.x = x; this.y = y;
        }
        int x;
        int y;
    }
  • 相关阅读:
    论文阅记 YOLOv4: Optimal Speed and Accuracy of Object Detection
    【项目实战】yolov3-tiny人脸数据模型训练
    面试题54. 二叉搜索树的第k大节点
    102. 二叉树的层序遍历
    107. 二叉树的层次遍历 II
    连续子数组的最大和
    172. 阶乘后的零
    26 进制
    405. 数字转换为十六进制数
    504. 七进制数
  • 原文地址:https://www.cnblogs.com/cjshuang/p/6653528.html
Copyright © 2020-2023  润新知