zoukankan      html  css  js  c++  java
  • 图的BFS----迷宫问题

    题目描述:

    ...11111111111111111111111111111
    11.111111........1111111111.1111
    11.111111..111.11111111.....1111
    11.11111111111.1111111111.111111
    11.111111.................111111
    11.111111.11111111111.11111.1111
    11.111111.11111111111.11111..111
    11..........111111111.11111.1111
    11111.111111111111111.11....1111
    11111.111111111111111.11.11.1111
    11111.111111111111111.11.11.1111
    111...111111111111111.11.11.1111
    111.11111111111111111....11.1111
    111.11111111111111111111111.1111
    111.1111.111111111111111......11
    111.1111.......111111111.1111.11
    111.1111.11111.111111111.1111.11
    111......11111.111111111.1111111
    11111111111111.111111111.111...1
    11111111111111...............1.1
    111111111111111111111111111111..
    
    如上图的迷宫,入口,出口分别:左上角,右下角
    "1"是墙壁,"."是通路
    求最短需要走多少步?

    代码实现:

     1 import java.util.LinkedList;
     2 import java.util.Queue;
     3 import java.util.Scanner;
     4 
     5 public class 图的bfs_迷宫 {
     6     public static void main(String[] args) {
     7         Scanner scanner = new Scanner(System.in);
     8         int m = 21;
     9         int n = 32;
    10         char[][] graph = new char[m][n];
    11         int[][] vis = new int[m][n];// 标记哪些点已经被访问
    12         Queue<Node> queue = new LinkedList<>();
    13         for (int i = 0; i < m; i++) {
    14             graph[i] = scanner.nextLine().toCharArray();
    15         }
    16         // for (int j = 0; j < graph.length; j++) {
    17         // for (int k = 0; k < graph[j].length; k++) {
    18         // System.out.print(graph[j][k]);
    19         // }
    20         // System.out.println();
    21         // }
    22 
    23         Node start = new Node(0, 0, 0);
    24         queue.add(start);
    25         while (!queue.isEmpty()) {
    26             Node poll = queue.poll();
    27             int x = poll.x;
    28             int y = poll.y;
    29             int deep = poll.depth;
    30             vis[x][y] = 1;// 标注为已访问
    31             // 判断是否到达终点
    32             if (x == m - 1 && y == n - 1) {// 走到出口
    33                 System.out.println(poll.depth);
    34                 break;
    35             }
    36             // 加四个邻居
    37             if (x - 1 >= 0 && vis[x - 1][y] == 0 && graph[x - 1][y] == '.') {
    38                 queue.add(new Node(x - 1, y, deep + 1));
    39             }
    40             if (x + 1 < m && vis[x + 1][y] == 0 && graph[x + 1][y] == '.') {
    41                 queue.add(new Node(x + 1, y, deep + 1));
    42             }
    43             if (y - 1 >= 0 && vis[x][y - 1] == 0 && graph[x][y - 1] == '.') {
    44                 queue.add(new Node(x, y - 1, deep + 1));
    45             }
    46             if (y + 1 < n && vis[x][y + 1] == 0 && graph[x][y + 1] == '.') {
    47                 queue.add(new Node(x, y + 1, deep + 1));
    48             }
    49         }
    50     }
    51 
    52     static class Node {
    53         int x;
    54         int y;
    55         int depth;
    56 
    57         public Node(int x, int y, int depth) {
    58             this.x = x;
    59             this.y = y;
    60             this.depth = depth;
    61         }
    62     }
    63 }

    运行结果:

      

  • 相关阅读:
    小例子-使用JS/JQ获取a标签的href网址
    R语言随手记-线性回归模型诊断
    R语言随手记-数据处理
    正选择分析-PAML discussion group
    ggtree-基本函数使用
    PhastCons
    R语言随手记-批量读取和循环处理多个数据文件
    变异位点有害性软件评估
    ggplot画图-分页and排序
    R画图-标题和坐标轴篇
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10416114.html
Copyright © 2011-2022 走看看