首页 > 编程语言 ># 909 -「java」一维数组展开+ BFS解决 -蛇梯棋- 最短步进次数 的详细思路

# 909 -「java」一维数组展开+ BFS解决 -蛇梯棋- 最短步进次数 的详细思路

时间:2023-03-14 20:35:09浏览次数:58  
标签:一维 java 步进 int 909 BFS 数组 np curr

Tags:

  • 中等

  • 数组

  • BFS

  • java

 

题目链接:

909. 蛇梯棋

 

注意事项 [题目中的坑]:

  1. 【"S形"的概念】: 题目开头举例的N*N的数组, 其内标示的1~N²数字, 指代的是当前格子是第几个格子, 用于标识S形路径的路线图, 并不是指当前格子内的元素值;

  2. 【"梯子"/"蛇"的概念】: 题目开头示例图中的"梯子"/"蛇"示例, 是需要匹配示例给的示例输入数组去看, 示例的二维数组中bord5为15, 此处为一个"梯子", 其元素值为"15", 其出口为"第15个方格", 出口坐标位置bord3; 从bord3位置的下一步, 可以走到bord3, 此处为"蛇", 元素值为"13", 则其出口为"第13个格子", 出口坐标位置为bord3....

  3. 【"前进"的注意事项】: 本题中的"前进", 是指"步进", 步进的过程只可往前, 不可向后(即只能顺着以为数组的角标向后遍历), 除非是步进后直接走到了"梯子"/"蛇"处, 才有可能会走回头路; 所以为了避免此时回头路出现死循环的状况, 则需要利用Map做缓存, 存储在指定一维角标处, 已经走的步数;

 

解题思路 [数组展开 + BFS]:

  1. 因为题目中输入为二维数组, 且要求遍历路径为S形, "梯子"和"蛇"的出口是按照方格的个数标记, 所以, 可以想到先将原二维数组按照题目的要求S形一维展开;

  2. 根据题目意思, 可以简化模型为: 操作一维数组, 每次步进距离为[1~6], 步进后遇到"梯子"/"蛇"的位置, 即直接跳到"梯子"/"蛇"的出口, 判断一共需要几次能跳到一维数组的尾部;

  3. 根据简化后的模型判断此题为"几步内走道指定位置"的求解题, 此类型题目可以使用BFS求解;

  4. 利用队列, 队列中存储的是当前步进位置的角标, 队列中拉取元素, 判断下一步能够走到的所有途径放入到队列中, 遍历的终止条件为, 当前遍历位置/下一步能够达到一维数组的尾部, 直至队列为空再停止遍历;

 

实现代码 [java]:

 class Solution {
     public int snakesAndLadders(int[][] board) {
         //二维数组先展开成一维
         int l = board.length;
         int w = board[0].length;
         int[] temp = new int[l*w];
         for(int i = 0; i< l; i++){
             int curr= w * i;
             boolean isRight = (i%2 == 0);
             for(int j = 0; j< w; j++){
                 if(isRight){//从左往右遍历单行
                     temp[curr +j] = board[l-i-1][j];
                }else{//从右往左遍历当行
                     temp[curr +j] = board[l-i-1][w-j-1];
                }
            }
        }
 ​
         //广度优先算法(借助队列实现)
         Queue<Integer> queue = new LinkedList<>();  //存储从当前节点能够走出的所有情况的(一维展开数组的)角标
         Map<Integer, Integer> m= new HashMap<>();   //key: 当前个格子数, value: 当前格子下, 已经走的步数
         queue.add(0);
         m.put(0,0);
 ​
         while(!queue.isEmpty()){
             int s = queue.size();
             for(int i=0; i< s; i++){
                 Integer curr = queue.poll();
                 int step = m.get(curr);
                 if(curr == l*w) return step;
 ​
                 for(int j = 1; j<=6; j++){
                     int np = curr+j;
                     if(np <=0 || np > l*w) continue;
                     if(temp[np] != -1){   //梯子或蛇
                         np = temp[np]-1; //此处注意: 是移动到第15个, 而不是temp[15]
                    }
                     if(np +1 == l*w) return step+1; //单次跳跃, 直接跳到终点
                     if(m.containsKey(np)) continue;
                     queue.add(np);
                     m.put(np, step+1);
                }
            }
        }
         return -1;
    }
 }

 

提交记录 [20210627]:

 执行用时:7 ms, 在所有 Java 提交中击败了66.90%的用户
 内存消耗:38.4 MB, 在所有 Java 提交中击败了83.80%的用户
 

标签:一维,java,步进,int,909,BFS,数组,np,curr
From: https://www.cnblogs.com/zhiyuanzag/p/17216233.html

相关文章

  • # 92 -「java 」 100-执行速度 - 三步『截取子链表- 递归反转- 拼接』 解题的实现思路
    Tags中等递归链表java 题目链接:92.反转链表II 解题思路[截取子链表+反转+拼接]:以1->2->3->4->5,m=2,n=4为例:【截取】定位到需要反......
  • Java Mybatis 笔记
    MyBatis1、简介1.1什么是MybatisMyBatis是一款优秀的持久层框架;它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获......
  • CFR 反编译 Java 枚举
    CFR到这里下载。运行如下命令使用当前文件夹下的cfr-0.152.jar反编译当前文件夹下的T.class。java-jarcfr-0.152.jarT.class--sugarenumsfalse其中--sugarenum......
  • Java的HashMap
    基于hash值的K-V结构数据容器。重要计算方法计算key的hash值(key==null)?0:(h=key.hashCode())^(h>>>16)利用hash计算tab中的位置p=tab[i=(n-1)&......
  • java变量和常量
    一标识符我们所认识的标识符如:类名HelloWorld标识符的命名规则标识符可以由字母,数字,下划线和和美元符$组成,不能以数字开头标识符严格区分大小写标识符......
  • java实体类之间的转换
    字段相同BeanUtils.copyProperties(item,dto);字段不同通过mapstruct,定义不同的字段名字https://blog.csdn.net/weixin_55806809/article/details/125347999......
  • 平安金服java岗
    电话一面面试官很和蔼,会适度闲聊,奈何本人全程很紧绷,自我介绍之后被安抚别太紧张 ̄□ ̄||1.自我介绍2.最近的一次项目概况,技术难点,怎么攻克的(我自爆代码是网上找的,真无语,一紧张......
  • Java容器之Hashtable源码分析
    一、概述Hashtable是一个比较古老的Map实现类,从它的名称就可以看得出来,因为没有遵循Java的语言规范。它和HashMap很像,同属于散列表,有以下特性:线程安全,这也估计算是唯一......
  • nacos报错 Caused by: com.alibaba.nacos.api.exception.NacosException: java.io.IOE
    麻麻劈,根据这个报错一顿ulimit -n 修改打开文件数,鸡儿报错一直在。 最终修改 vi/etc/sysctl.conf增加三项:fs.inotify.max_queued_events=32768fs.inotify.ma......
  • vscode 中如何运行一个 java 的 hello world
    经常遇到遇到需要运行一些片断性的的代码,比如调试一个函数是否符合预期,在小项目中,又不想写单元测试,就需要一个轻量化的工具,vscode可以轻松胜任。以下内容来自ChatGPT,经本......