Java编程能力强化(2)——搜索解决方案类问题的通用解法

Java架构师分布式搜索数据准确性解决方案 目录 1 Elasticsearch内置分词器 1.1 Standard(标准分词器) 1.2 Simple(简单分词器) 1.3 Whitespace(空格分词器) 1.4 Stop(停止分词器) 1.5 Keyword(关键字分词器) 1.6 Pattern(模板分词器) 1.7 Language(语言分词器) 1.8 Fingerprint(指纹分词器) 2 Es 模糊查询 match和wildcard选择 2.1 match:分词模糊查询 2.2 match_phrase :短语模糊查询 2.3 w 阅读详情

前几天发了一篇文章《Java编程能力强化——狼羊过河问题》,有朋友指出了一些问题,这些问题有:1、没有采用面向对象的思想,没有定义自己的类,好像与Java无关,像是C语言的编程思维。2、没有给出代码的思路。3、对是否能够提高Java编程能力表示怀疑。本文首先对第一个问题进行解释,然后给出这一类问题的通用的解决方案,然后对之前的狼羊过河代码进行分析,主要是对涉及的Java知识进行分析。

 


 

第一,编程序就是解决问题,解决问题才是硬道理

简单理解,程序就是对用户的输入进行处理,然后输出处理的结果。把人的需求表示成计算机可以理解的形式,然后由计算机进行处理,然后把计算的结果再转换为用户可以理解的形式。信息的表示是数据库结构的问题,信息的处理是算法要解决的问题,所以在计算机课程中数据结构和算法是非常重要的两门课。而数据结构和算法的实现需要一门语言,所以你可能会看到数据结构(C语言)或者数据结构(Java语言),算法通常采用伪代码。

对于狼羊过河问题,如果采用面向对象的分析,需要考虑描述中出现的对象,根据这些对象抽象出来类以及类层次,这里涉及的对象包括3只狼、3只羊、一条船,以及狼羊共存的规则以及船的容量,但是这些对象基本上没有属性和行为,所以构造成类也并不合适,所在在给出的参考代码中没有进行面向对象的设计。

另外这个题目主要是考察如何解决问题,关心的是羊和狼的数量,如何在各种约束条件下把狼和羊运送到河对岸,所以参考答案的重点是算法。

而在实现算法的过程用到了String、StringBuffer、Integer、异常处理、数组、方法的递归调用等Java语言特性,所以不能说与Java无关。

个人觉得Java中需要掌握的有3个方面的知识:基本语法、常用类库和面向对象特性,而本练习题主要是对前两个方面的强化。

 


 

第二,搜索解决方案类问题的通用解法

这类问题有下面的特点:

1、有初始状态,例如3只狼和3只羊需要过河,意味着刚开始3只狼和3只羊都在河的一个岸边。

2、有目标状态,例如3只狼和3只羊要到达河的对岸,意味着最后3只狼和3只羊都要和的对岸。

3、通过一些规则可以使状态发生变化,例如可以用船把2只狼运送到和的对岸,这时候的状态就是河的一边有3只羊和1只狼,河的另一边有2只浪(当然可以根据一边的数字推算出另一边的数字,因为要么在这边要么在那边)。

 

人是如何来解决这类问题的呢?看下面的图:

 

首先考虑3只狼3只羊在左边,船只能装两只动物,所以有5种方案,然后看看每一种方案产生的结果是不是想要的结果,如果不是,继续看有哪些情况,上面的图展示了这个过程。图中的右表示把动物运送到对岸,左表示船再回来。

 

程序如何来实现这个过程呢?

程序的实现过程是对人思考问题的模拟。有两种方式,一种方式按照层来找,初始状态下,考虑5种可能,然后对5种可能进行分析,然后对每一种情况的可能变化情况再考虑,直到找到目标状态,或者不能再变化,称为广度优先搜索。另一种方式是先考虑5种情况中的一种,考虑完之后考虑这一种情况能够转移成哪些状态,然后再考虑其中一个,称为深度优先搜索。之前给出的参考答案采用的是深度优先搜索。

例如下图,如果按照广度优先:则每个状态处理的顺序为:1(第一层) 2 3(第二层) 4 5 6(第三层) 7 8 9 10(第四层)

如果按照深度优先:则每个状态的处理顺序为:1 2 4 7 3 5 8 9 6 10,2下面的情况处理完再处理3下面的情况,同样5下面的情况处理完才处理6下面的情况。

 

算法的关键部分如下:

1、需要定义1个结构来表示状态,包括初始状态、中间状态和目标状态。我的参考代码中使用了int state[]表示状态。

2、要明确初始状态和目标状态。代码中初始状态为[3,3]表示岸上有3只狼和3只羊,目标状态为[0,0]表示狼和羊都过河了。

3、要明确状态转换的规则,通常每个规则可以定义为方法,方法的输入是一种状态,而输出是另一种状态。代码中move方法完成了这个功能,只是我把多个规则写在了同一个方法中。

4、编写主程序,从初始状态开始,不断地进行状态转换直到结束。有两种处理方式,方法的递归调用,和循环。

 

可能存在的问题:

1、死循环,最直观的例子,让一只狼到对岸,然后再回来,然后再过去,然后再回来...,永远不会有结束的时候,对于这个问题需要进行控制,有效的方式是记录走过的状态,如果发现重复,放弃这个方案。程序中有两个地方进行了控制。

2、解的空间可能会非常大,如果不采取措施可能永远也运行不完。例如下象棋,大家都知道谁想的远,谁就可能赢,如果让电脑把100步之后的情况都考虑到,我想人可能很难赢,但是让电脑考虑100步需要太大的计算量,如果考虑每一步有20种走法,则需要考虑20的100次方,可以想象这个数字有多大。对于这个问题,通常会采用启发式搜索以及剪枝等。感兴趣的同学可以参考相关书籍。


 

三、关键代码分析

完整代码参考:Java编程能力强化——狼羊过河问题

关键点分析:

1、public void next(int state[],StringBuffer str)

递归调用的方法,处理指定的状态下面的所有状态。

2、  if(str==null){ //表示第一步
   // 一只狼一只羊
   newState = move(state,"-1-1");
   next(newState,new StringBuffer("-1-1"));
   // 两只狼过河
   newState = move(state,"-2-0");
   next(newState,new StringBuffer("-2-0"));
   return;
  }
对初始状态进行处理,也可以合并在下面的代码中,如果合并需要判断str是否为空。另外,这里的return不能省略。

3、  if(state[0]==0 && state[1]==0){ // 全部转移到右岸了
   printResult(str);
   return;
  }
表示得到目标状态,处理结束。

4、   // 两只狼
   if(state[0]>=2 && !str.substring(0,4).equals("+2+0")){
    newState = move(state,"-2-0");
    if(check(newState)){
     next(newState,new StringBuffer(str).insert(0,"-2-0"));
    }
   }
注意:new StringBuffer(str).insert(0,"-2-0")不能写成
str.insert(0,"-2-0")

另外!str.substring(0,4).equals("+2+0")的作用防止去和回船上的动物是一样的。

5、 public int[] move(int state[],String info){
  int lang = 0;
  try{
   lang = Integer.parseInt(info.substring(0,2));
  }catch(Exception e){
   lang = Integer.parseInt(info.substring(1,2));
  }
  int yang = 0;
  try{
   yang= Integer.parseInt(info.substring(2));
  }catch(Exception e){
   yang = Integer.parseInt(info.substring(3));
  }
  int[] result = new int[state.length];
  result[0] = state[0]+lang;
  result[1] = state[1]+yang;
  return result;
 }

注意:try语句的使用,因为+3转换为数字的时候出现异常

另外不能直接修改state的元素值然后把state返回。

6、public boolean check(int state[]){
判定羊的个数不能小于狼的个数。

7、public boolean hasExist(StringBuffer str){
判断是否有死循环。

8、public void printResult(StringBuffer str){
输出结果方案。

大家可以试着使用广度优先的方式实现代码,可以不用递归的方式进行处理(如果递归的层数比较多,会出现堆栈溢出问题)。

Java编程实战:提升面向对象设计与数据结构处理能力 本文还有配套的精品资源,点击获取 简介:“Assignment2”是一个以Java语言为核心的编程作业,意在加深学生对Java编程的掌握。任务可能涵盖类与对象的创建、数据结构处理、控制流程编写、面向对象编程原则的应用,以及可能的异常处理和文件操作。Java的平台独立性和面向对象的特性将是学习的重点,学生将通过具体的编程任务来实践和强化这些技能。 1. Java基础... 阅读详情

相关推荐

Java程序设计实战训练

Java程序设计实战训练,带大量源程序,倾情奉献!

七大查找算法(Java版)

七大查找算法 顺序查找、二分查找、插值查找、斐波那契查找、二叉树查找、分块查找、哈希查找

HK的博客 1万+

图片搜索(java实现)

这是一个用pHash算法实现的图像搜索实例,供大家相互学习参考。

强化学习之旅 —— 探索Java实现的深度与魅力

强化学习之旅 —— 探索Java实现的深度与魅力 java-reinforcement-learningPackage provides java implementation of reinforcement learning algorithms such Q-Learn, R-Learn, SARSA, Actor-Critic项目地址:https://gitcode.com/gh_mir...

gitblog_00084的博客 474

几种常见的基于Lucene的开源搜索解决方案对比

几种常见的基于Lucene的开源搜索解决方案对比,大家参考一下。

告别sgmediation!Stata中介效应分析新选择:mediation包完整操作指南

本文介绍了Stata中介效应分析从传统sgmediation命令向mediation包的范式升级。重点阐述了如何使用medeff和medsens命令进行更严谨的因果推断,并执行关键的敏感性分析,以评估结果对未观测混杂的稳健性,为学术研究提供发表级的分析工具。

redis7keeper的博客 1161

Java实现强化学习在Freeway游戏中的探究尝试

强化学习与Q-learning的基本逻辑已经在上一部分简要阐述了,其中心思想便是图示的通过“探索行动”来在当前状态下走到下一个状态,同时获得环境产生的“奖励(或惩罚)”,以此来不断学习某一状态下进行某一动作的价值,以便后续在相同状态的决策过程中能更加正确地考虑到底该执行什么动作。其背后的哲学思想类似于我们在动物身上发现的条件反射,如果对某种行为进行正向刺激,动物在经过反复刺激过后将更加倾向于进行某种行为,而对某种行为施加惩罚则后续将更不倾向于进行这种行为。Q-learning用一张Q-table来记录环境状

毕业作品网站 1378

保姆级教程:用MATLAB搞定双目相机标定,从导入图片到参数解读全流程

本文提供了一份详细的MATLAB双目相机标定全流程指南,涵盖从图片准备到参数解读的每个环节。重点讲解了棋盘格选择、拍摄技巧、MATLAB工具箱设置及参数优化,帮助读者避免常见错误并提升标定精度。特别适合机器人导航、三维重建等领域的开发者。

weixin_33737134的博客 430

CS中实现简单的注册验证窗体程序

场景 效果 实现 打开VS,新建窗体程序 快捷键ctrl+alt+x打开工具箱,拖拽label、TextBox、Button,实现注册窗体布局。 在输入框TextBox后面还有对应的提示用的label,将其Text设为空,设置好name属性,将字体颜色设为红色。 将密码以及确认密码的TextBox的属性--行为--PasswordChar设置为* 在解决...

BADAO_LIUMANG_QIZHI的博客 580

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864

【nvidia-B200 生产环境】NVIDIA 570.124.06+Cuda12.8 Ubuntu22.04 nccl-test 一键部署脚本(免修改复制即用)

目录1. 初始化与日志记录2. 安装基础工具与配置更新3. NVIDIA 驱动安装 570.124.064. 安装 Mellanox OFED 24.10-2.1.8.05. 安装 CUDA 12.86. 安装 NCCL 和测试7. 配置 rc.local 和其他优化8. B200 单独步骤9. 最终测试与重启10. 完整生产脚本,复制即可直接使用总结 功能: 设置日志目录和日志文件路径。 使用 命令将标准输出和错误输出同时写入日志文件和终端。 记录脚本开始时间,并计算开始的秒数

jundao1997的专栏 2799

Java编程能力强化——狼羊过河问题

题目:有3只狼和3只羊要过河,只有一条船,一次最多只能坐两只动物并且每次必须有动物开船,如果某一边的狼的个数大于羊的个数,羊将被吃掉,编程给出解。 关于编程思路,参考:Java编程能力强化(2)——搜索解决方案类问题的通用解法 参考答案: package ch

jasontome的android之路:Do it. Do it right. Do it righ 878

【STK】手把手教你利用STK进行弹道导弹和运载火箭发射仿真的相关方法全过程解析

写这个系列主要是这几年做了一些弹道导弹和运载火箭发射的相关仿真项目,stk软件由于其专业性在国内比较小众,相关的教程和书籍、经验贴都不是很多,因此新手在进行开发中容易遇到较多困难,把自己的一些经验体会写下来,一方面供自己总结回顾,另一方面也希望对大家有所帮助。这个系列计划分几篇文章写完,每章的内容结构相似,都分为①如何确定发射场位置和发射轨迹、②导入导弹和运载火箭模型、③设计模型分段动作、④飞行参数分析和相关应用这四个部分,每篇文章争取完整描述1-2个实际项目的操作过程。

weixin_44184852的博客 5989

解读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

《Effective Java》第三版中的第4条是“通过私有构造器强化不可实例化的能力”。其主要目的是防止类被实例化,从而保证该类只能用于提供静态方法或字段。这个设计模式常用于工具类,比如 `java.lang.Math` 类,因为这些类的实例化没有实际意义,同时避免潜在的错误和不必要的资源开销。

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 1066

高通Camx功能feature分析之八:高通NCS服务之架构和初始化

本文介绍了高通NCS(NONCameraSensor)服务的架构与初始化流程。NCS服务通过QMI接口访问非相机传感器,为CameraEIS、AEC等算法节点提供陀螺仪、加速度计等传感器数据支持。文章详细解析了NCS服务的分层架构,包括客户端、服务端、QSEE接口实现等组件,并重点分析了初始化过程中获取传感器列表、查询能力等关键步骤。通过camxsetting.xml中的enableNCSService开关控制服务启动,初始化过程涉及QSEE单例创建、传感器能力查询等核心操作。后续文章将继续深入讲解相关技术

931

《低功耗方法学》翻译——前言

前言

记录所学,分享知识,结识挚友 1209

java狼追着羊跑的程序_Java编程能力强化——狼羊过河问题

题目:有3只狼和3只羊要过河,只有一条船,一次最多只能坐两只动物并且每次必须有动物开船,如果某一边的狼的个数大于羊的个数,羊将被吃掉,编程给出解。 关于编程思路,参考:Java编程能力强化(2)——搜索解决方案类问题的通用解法 参考答案: package ch1; public class LangAndYang { public static void main(String[] a...

weixin_31052141的博客 654

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1489

Effective Java学习-通过私有构造器强化不可实例的能力

本文是对《Effective Java第2章第4条的内容进行介绍和解读。条建议通过私有构造器来强化不可实化的能力,以防止类被意外地实例。这种技术通常被用在工具类或者包含静态方法和静态字段的类上。

weixin_36639192的博客 466

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

如何提升自己的编程能力

可以从简单的项目入手,如开发一个天气查询小程序、设计一个图书管理系统,逐步过渡到复杂的项目,如电商平台、在线教育系统。重复编写相似代码是编程中的大忌。同时,采用模块化编程思想,将复杂的程序分解为多个功能独立的模块,每个模块负责特定的任务,模块之间通过接口进行交互。同时,将学习成果应用到实际项目中,形成“学习—实践—反思—再学习”的良性循环,不断突破自我,实现编程能力的持续提升。通过系统化的学习方法和长期的实践积累,不仅能掌握扎实的编程技能,还能培养解决复杂问题的能力,在编程领域不断进步,实现个人职业目标。

2501_90978596的博客 809

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java搜索类问题的通用解

搜索解决方案类问题的通用解法 这类问题有下面的特点: 1、有初始状态,例如3只狼和3只羊需要过河,意味着刚开始3只狼和3只羊都在河的一个岸边。 2、有目标状态,例如3只狼和3只羊要到达河的对岸,意味着最后3只狼和3只羊都要和的对岸。 3、通过一些规则可以使状态发生变化,例如可以用船把2只狼运送到和的对岸,这时候的状态就是河的一边有3只羊和1只狼,河的另一边有2只浪(当然可以根据一边的数字推算出另

行者无疆 421

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: Java编程能力强化——狼羊过河问题
下一篇: Java编程能力强化(3)——选拨试题
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值