JavaSE-回溯+自定义类栈实现Puzzle问题

2023-05-16

Puzzle问题描述

如图有一个一维数组,上面的数字表示可以移动的步数,每个结点都有左右两个方向可以移动,例如第一个结点4,它只能往右移动4格到3的位置,而3左右都可以移动,要求是找到一条路径能够到达最后一个结点,该节点的值必定是0,如果能找到打印输出。手动测试完成后改为随机生成长度和元素值进行测试。

和迷宫问题类似,见迷宫问题,它变得更简单了。

先自定义一个类栈:

栈中用一个自定义的puzzleNode类型的一维数组存储结点信息,size为栈中有效元素个数,操作主要有入栈,出栈,取栈顶元素。

package com.puzzle;


import java.util.Arrays;
import java.util.EmptyStackException;

/**
 * Description :
 * Created by Resumebb
 * Date :2020/10/21
 */
public class MyStack {
    private puzzleNode[] element;
    private int size;
    private static final int INITSIZE = 100;

    public MyStack(){
        element = new puzzleNode[INITSIZE];
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    private void ensureCapacity(){
        if(size == element.length){
            element = Arrays.copyOf(element,element.length+(element.length>>1));
        }
    }

    public void push(puzzleNode puzzleNode){
        ensureCapacity();
        element[size++] = puzzleNode;
    }

    public void pop(){
        if(size == 0){
            return;
        }
        size--;
    }

    public puzzleNode peek(){
        if(size == 0){
            throw new EmptyStackException();
        }
        return element[size-1];
    }
}

接下来定义结点类:

成员变量有结点的方向,东西四个方向,当前所在一维数组坐标,以及当前结点的value值。

package com.puzzle;

/**
 * Description :
 * Created by Resumebb
 * Date :2020/10/21
 */
public class puzzleNode {
    private int value;
    public boolean way_east;
    public boolean way_west;
    private int index;

    public puzzleNode(int value, int index){
        this.value = value;
        this.index = index;
    }

    public puzzleNode(){

    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

接下来定义操作类,寻路,初始化操作等在此类中进行:

package com.puzzle;
import java.util.Arrays;
import java.util.Scanner;

/**
 * Description :
 * Created by Resumebb
 * Date :2020/10/24
 */
public class Puzzle {
    private puzzleNode[] puzzleNodes;
    private int index;

    public Puzzle(int index) {
        this.index = index;
        puzzleNodes = new puzzleNode[index];
    }

    public void goPuzzle(){
        initValue();
        initWayState();
        MyStack stack = run();
        display(stack);
    }

    public void initValue(){
        Scanner in = new Scanner(System.in);
        System.out.println("input value:");
        for (int i = 0; i < 10; i++) {
            puzzleNodes[i] = new puzzleNode(in.nextInt(),i);
        }
    }

    private void initWayState(){
        for (int i = 0; i < 10; i++) {
            //右边能走
            if((i+puzzleNodes[i].getValue())<10){
                puzzleNodes[i].way_east = true;
            }
            //左边能走
            if((i-puzzleNodes[i].getValue())>=0){
                puzzleNodes[i].way_west = true;
            }
        }
    }

    //4 8 5 2 3 5 1 6 4 0
    public MyStack run(){
        MyStack stack = new MyStack();
        int i = 0;
        stack.push(puzzleNodes[0]);

        while(stack.getSize()!=0){
            //东边可走
            if(puzzleNodes[i].way_east){
                stack.push(puzzleNodes[i+puzzleNodes[i].getValue()]);
                puzzleNodes[i].way_east = false;
                i += puzzleNodes[i].getValue();
            }

            //西边可走
            else if(puzzleNodes[i].way_west){
                stack.push(puzzleNodes[i-puzzleNodes[i].getValue()]);
                puzzleNodes[i].way_west = false;
                i -= puzzleNodes[i].getValue();
            }

            //四路不通出栈
            else {
                stack.pop();
                if(stack.getSize()==0){
                    System.out.println("无路");
                    System.exit(0);
                }
                i = stack.peek().getIndex();
            }

            if(puzzleNodes[i].getValue() == 0){
                return stack;
            }
        }
        return stack;
    }

    public void display(MyStack stack){
        StringBuilder stringBuilder = new StringBuilder();
        int len = stack.getSize();
        for (int i = 0; i < len; i++) {
            stringBuilder.append(stack.peek().getValue()+"->");
            stack.pop();
        }
        System.out.println("存在路径");
        System.out.println(stringBuilder.reverse());
    }

    public void randomTest(int len){
        for (int i = 0; i < len-1; i++) {
            puzzleNodes[i] = new puzzleNode(1+(int)(Math.random()*(8+1)),i);
        }
        puzzleNodes[len-1] = new puzzleNode(0,len-1);
        System.out.println("Puzzle生成为:");
        for (int i = 0; i < len; i++) {
            System.out.print(puzzleNodes[i].getValue()+" ");
        }
        System.out.println();
        initWayState();
        MyStack stack = run();
        display(stack);
    }
}

 

测试类:

package com.puzzle;

import com.maze.Maze;

import java.util.ArrayList;
import java.util.Queue;
import java.util.Scanner;

/**
 * Description :
 * Created by Resumebb
 * Date :2020/10/24
 */
public class puzzleTest {

    public static void main(String[] args) throws Exception {
        //手动测试
//        Scanner in = new Scanner(System.in);
//        System.out.println("input size:");
//        Puzzle puzzle = new Puzzle(in.nextInt());
//          puzzle.goPuzzle();

        //随机生成
        int len = 10 + (int)(Math.random()*(5+1));
        Puzzle puzzle = new Puzzle(len);
        puzzle.randomTest(len);

    }
}

手动测试截图:

自动生成测试截图:

 

自动生成寻找一条存在的路径比较困难,我生成了好多次才找到一条。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaSE-回溯+自定义类栈实现Puzzle问题 的相关文章

  • 自定义ClassLoader,用于加载用户JAR包

    原文地址 http obullxl iteye com blog 651128 Copyright c YMCN Team All rights reserved package com aboy toolkit util import j
  • 多态(polymorphic)

    目录 1 多态的基本介绍 2 多态实现条件 3 重写 重写的介绍 重写和重载的区别 动 静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点 总结 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象也是最重要的特征 多态是
  • Java多态

    关于引用的进一步理解 交换值 因为Java方法在传递参数的时候都是值传递 那么如何通过方法实现2个数的值交换 明确 在传引用的时候 到底拿引用干了个啥 class Value public int a public class Test p
  • Java面向对象——图书管理系统(小白也能看的懂!)

    文章目录 一 功能介绍 二 JAVA面向对象思想 包的分装 1 book包 2 user包 较复杂 3 operation包 接口包 三 代码框架的搭建 1 book包 Book类 2 book包 BookList类 3 operation
  • 包装类自动装箱和拆箱原理

    包装类的自动装箱和自动拆箱 包装类的自动装箱和拆箱是JDK1 5的新特性 一 首先 了解自动装箱的过程 有两种自动装箱过程 第一种 128 127 之内 调用相应包装类的valueOf 例如 Integer i 12 Integer a 2
  • 什么?到现在你还不知道什么是 访问修饰限定符吗?

    导航小助手 前言 一 public 访问修饰限定符 二 private 访问修饰限定符 三 default 访问修饰限定符 3 1 包的概念 3 2 导入包中的类 3 3 自定义包 3 4 包访问权限 3 5 常见的包 四 protecte
  • java虚拟机+分隔符

    java 入门 java 虚拟机 1 java虚拟机的平台可移植性 只要将java虚拟机安装于不同平台 我们编译的 class 文件就可以运行 2 jdk java开发 3 jre java运行时环境 jdk jre 下载安装后必须在环境变
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • Object&Objects

    Object 概念 Object 是类层次结构的根 每个类都可以将 Object 作为超类 所有类都直接或者间接的继承自该类 换句话说 该类所具备的方法 所有类都会有一份 toString 作用 以良好的格式 更方便的展示对象中的属性值 重
  • System.out.println()影响系统运行效率!!!

    在Java开发中 System out println 是一种常用的输出方式 可以将字符串输出到控制台 然而 这种输出方式在一定程度上会影响系统的运行效率 首先 System out println 的输出操作需要占用CPU和内存资源 因为
  • Scanner类用法(学习笔记)

    Scanner类用法 学习笔记 后续会补充 1 next 用法 package com yushifu scanner import java util Scanner util java工具包 Scanner类 获取用户的输入 Scann
  • 对象锁和类锁的个人理解

    一 对象锁 1 解释 对象锁 顾名思义锁的是对象实例 但程序中同一个类可以有多个实例化对象 所以对象锁只能锁住同一个实例化对象 再两个或多个实例化对象之间不起作用 2 使用方法 1 锁住实体里的非静态变量 synchronized 变量名
  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • 单词混淆算法

    给定一个混乱的单词 即 ofbaor 如何解读字母以创建一个真正的单词 即 foobar 我可以看到这有几种方法 我想我知道如何在 NET 中做到这一点 但我很好奇其他一些解决方案是什么样的 总是很高兴看到我的解决方案是否是最佳的 这不是家
  • 确定数组是否包含 n...n+m 的算法?

    我在 Reddit 上看到这个问题 但没有给出积极的解决方案 我认为在这里问这个问题是一个完美的问题 这是关于面试问题的帖子 编写一个方法 该方法接受大小为 m 的 int 数组 如果该数组包含数字 n n m 1 该范围内的所有数字以及仅
  • 在单词搜索拼图中将单词放置在表格网格中?

    我正在尝试创建一个由脚本生成的单词搜索谜题 文字应水平 垂直或对角放置 我可能需要设置是否允许它们仅向前或向后读取的选项 我有一系列单词 例如 苹果 香蕉 葡萄 柠檬 梨 需要放置在表中 我已经创建了表格 但我不知道如何将单词放入网格中 我
  • 为什么 (x += x += 1) 在 C 和 Javascript 中的计算结果不同?

    如果变量的值x最初为 0 表达式x x 1在 C 中将计算为 2 在 Javascript 中将计算为 1 C 的语义对我来说似乎很明显 x x 1被解释为x x 1 反过来 这相当于 x 1 x x where x is 1 at thi
  • 给定 N 个弹珠和 M 个楼层,找到算法来找到弹珠会破裂的最低楼层

    它与这个问题相关 两颗弹珠和一座 100 层的建筑 https stackoverflow com questions 6547 two marbles但它不一样 我们要找出最好的算法来找出最小化找到最低楼层所需的最大下降的策略 这就是我的
  • 将随机范围从 1–5 扩大到 1–7

    给定一个产生 1 到 5 范围内的随机整数的函数 编写一个产生 1 到 7 范围内的随机整数的函数 这相当于 Adam Rosenfield 的解决方案 但对于某些读者来说可能更清楚一些 它假设 rand5 是一个返回 1 到 5 含 范围
  • 算法:最大计数器

    我有以下问题 您有 N 个计数器 最初设置为 0 并且您对它们有两种可能的操作 increase X 计数器 X 加 1 max counter 所有计数器都设置为任何计数器的最大值 给出一个包含 M 个整数的非空零索引数组 A 该数组代表

随机推荐

  • 基于Keras实现电影评论文本分类与RNN实现

    notebook使用评论文本将影评分为积极 xff08 positive xff09 或消极 xff08 nagetive xff09 两类 这是一个二元 xff08 binary xff09 或者二分类问题 xff0c 一种重要且应用广泛
  • 基于STM32F407的七要素气象站(气象传感器)CR-WS数据处理实现

    一 七要素气象站介绍 1 七要素气象站介绍 开发板还是采用STM32F407 485连线 xff1a 如果买了变送器就按照下图连线 xff1a 没有买变送器的话 xff0c 直接从气象站上拉线 xff0c 红正黑负 xff0c 黄485 A
  • MyBatis Plus 分页查询,total字段为0,分页未生效

    1 未配置 MybatisPlusInterceptor 64 Bean public MybatisPlusInterceptor mybatisPlusInterceptor MybatisPlusInterceptor interce
  • JavaSE学习记录-整数逆序+数组删除元素

    数组定义方法 int arr 61 new int 10 定义同时进行赋值 xff1a int arr 61 new int 1 2 3 4 5 数组打印方法 1 for循环打印 for int i 61 0 i lt arr length
  • FAFTS文件系统常用函数学习

    一 FATFS文件系统基础知识 1 简介 文件系统可以从官网进行下载 官网地址 xff1a http elm chan org fsw ff 00index e html FATFS是一个完全免费开源的FAT 文件系统模块 xff0c Fa
  • Leetcode-旋转数组+最后一个单词长度

    给定一个数组 xff0c 将数组中的元素向右移动 k 个位置 xff0c 其中 k 是非负数 示例 1 输入 1 2 3 4 5 6 7 和 k 61 3 输出 5 6 7 1 2 3 4 解释 向右旋转 1 步 7 1 2 3 4 5 6
  • Leetcode-最短路径和+最大子串和(动态规划)

    给定一个包含非负整数的 m x n 网格 xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 输入 1 3 1 1 5 1 4 2 1 输出 7 解释
  • LeetCode-二进制串和+宝石与石头

    给你两个二进制字符串 xff0c 返回它们的和 xff08 用二进制表示 xff09 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 61 34 11 34 b 61 34 1 34 输出 34 100 34 示例 2 输
  • JavaSE数组练习-句子翻转+字符替换+打印特殊三角

    1 句子翻转 要求 xff1a 给定字符串如 34 hello i am a student 34 xff0c 对英语句子进行翻转 xff0c 并保持英语单词的顺序不变 xff0c 对标点符号当成字母处理 代码实现 xff1a import
  • 视觉SLAM学习--基础篇(SLAM框架及相机模型)

    一 例子 如上图的小萝卜机器人 xff0c 要使其具有自主运动能力至少需要两个条件 xff1a 1 我在什么地方 xff1f 定位 2 周围环境是什么样 xff1f 建图 因此它既需要知道自身的状态 位置 xff0c 也要了解所在的环境 地
  • Linux各类软件安装配置问题记录

    1 Ubuntu侧边栏和顶部栏消失不见 解决方法 xff1a 鼠标右键或者快捷键打开终端输入命令 dconf reset f org compiz 输入命令 setsid unity 一般到这一步侧边栏就会出现了 xff0c 如果没有出现就
  • 代码模拟确定有限自动机(DFA)执行过程

    一个确定有限自动机 xff08 DFA xff09 M是一个五元组 xff1a M 61 xff08 K xff0c xff0c f xff0c S xff0c Z xff09 其中 K是一个有穷集 xff0c 它的每个元素称为一个状态 x
  • 视觉SLAM-Eigen学习实践

    1 Eigen库介绍 Eigen 是一个 C 43 43 开源线性代数库 它提供了快速的有关矩阵的线性代数运算 xff0c 还包括解方程等功能 可以通过sudo apt install libeigen3 dev命令进行安装 xff0c 也
  • 苹果手机存储空间(或称为内存)满了导致黑屏转圈白苹果

    没刷机 xff0c 啥也没干 xff0c 发现把SIM卡拔了再开机就好了 xff0c 然后赶紧去卸载一些软件腾出空间
  • Arrays的toString方法和deepToString方法比较

    因为打印二维数组时用错了方法 xff0c 一般是用Arrays deppToString或者遍历使用toString xff0c 我直接用Arrays toString去打印了二维数组 xff0c 没有打印出正常二维数组的内容 xff0c
  • JavaSE-类与对象+单例模式

    1 类与对象的引用 概念 xff1a 如果一个变量的类型是类类型 xff0c 而非基本类型 xff0c 那么该变量又叫做引用 new testClass 该操作表示创建了一个testClass对象 xff0c 但没有办法访问这个对象 tes
  • JavaSE-类与对象-ATM自主操作系统实现

    学完类与对象的练习小作业 xff0c 主要有三个类 xff1a 银行卡类包含银行卡的相关信息如卡号 xff0c 密码 xff0c 姓名 xff0c 余额 xff1b 银行类中主要定义了一个银行卡数组 xff0c 用来存储当前用户的银行卡信息
  • JavaSE-基于回溯法用类+栈实现迷宫问题

    目录 1 问题描述 2 自定义类栈 3 结点类 4 操作类 5 函数讲解 6 测试类及结果 1 问题描述 输入迷宫大小 xff0c 以及路径 xff0c 0表示可走路径 xff0c 1表示死路 xff0c 从输入矩阵的左上角起点到右下角终口
  • Leetcode-234,844,19

    234 回文链表 请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 思路 xff1a 本想将链表逆置然后进行比较 xff0c 后来想了想用栈去做更
  • JavaSE-回溯+自定义类栈实现Puzzle问题

    Puzzle问题描述 如图有一个一维数组 xff0c 上面的数字表示可以移动的步数 xff0c 每个结点都有左右两个方向可以移动 xff0c 例如第一个结点4 xff0c 它只能往右移动4格到3的位置 xff0c 而3左右都可以移动 xff