php小编草莓广度优先搜索算法是一种常用的图遍历算法,但在某些情况下,它可能会出现错误的结果。广度优先搜索算法通常用于解决图的最短路径问题,其核心思想是从起始节点开始,逐层遍历图中的节点,直到找到目标节点或遍历完所有节点。然而,当图中存在环路或存在多个目标节点时,广度优先搜索算法可能无法得到正确的结果。因此,在使用广度优先搜索算法时,需要注意其局限性,并结合具体问题场景选择合适的算法。
问题内容
昨天我问了一个关于dfs的问题。今天我正在尝试实现 bfs。
本线程中未给出的 .java 类取自上一个问题。
我写了这个类:
breadthfirstsearch.java
import java.util.arraydeque; import java.lang.system; public class breadthfirstsearch extends searchalgorithm{ public breadthfirstsearch(int gridsize) { super(gridsize); } public void calc(int[]pos) { arraydeque<int[]>arraydeque = new arraydeque<>(); arraydeque.add(pos); while(!arraydeque.isempty()) { for(int[]i:arraydeque) { system.out.println(grid[i[0]][i[1]].getposition()); if (grid[i[0]][i[1]].getisexit()) { system.out.println("path been found!"); arraydeque.remove(i); } else if (grid[i[0]][i[1]].gettype() == 1) { system.out.println("path been blocked!"); arraydeque.remove(i); } else if (grid[i[0]][i[1]].getisvisited()) { arraydeque.remove(i); } else { grid[i[0]][i[1]].setisvisited(true); if (i[0] < gridlength - 1) { int[] c = i; c[0]++; arraydeque.add(c); } if (i[0] > 0) { int[] d = i; d[0]--; arraydeque.add(d); } if (i[1] < gridlength - 1) { int[] e = i; e[1]++; arraydeque.add(e); } if (i[1] > 0) { int[] f = i; f[1]--; arraydeque.add(f); } arraydeque.remove(i); } } } } }
我在 main.java 类中添加了以下内容:
breadthfirstsearch bfs = new breadthfirstsearch(9); bfs.print(); bfs.calc(pos);
对于 breadthfirstsearch.java
的构造函数,我得到这个矩阵:
position:0 type:0 position:1 type:0 position:2 type:1 position:3 type:0 position:4 type:1 position:5 type:1 position:6 type:1 position:7 type:0 position:8 type:0
while(!arraydeque.isempty()) { for(int[]i:arraydeque) { system.out.println(grid[i[0]][i[1]].getposition()); if (grid[i[0]][i[1]].getisexit()) { system.out.println("path been found!"); arraydeque.remove(i); } else if (grid[i[0]][i[1]].gettype() == 1) { system.out.println("path been blocked!"); arraydeque.remove(i); } else if (grid[i[0]][i[1]].getisvisited()) { arraydeque.remove(i); }
这些条件一开始都不成立,因此我们可以跳过它们。
else { grid[i[0]][i[1]].setisvisited(true);
我用position=visited设置了节点,所以我不需要再次检查它。
在这些条件中,只有 (1) 和 (3) 为真,因此我们向双端队列添加 2 个 int[] 数组:
if (i[0] < gridlength - 1) { int[] c = i; c[0]++; arraydeque.add(c); } if (i[0] > 0) { int[] d = i; d[0]--; arraydeque.add(d); } if (i[1] < gridlength - 1) { int[] e = i; e[1]++; arraydeque.add(e); } if (i[1] > 0) { int[] f = i; f[1]--; arraydeque.add(f); }
最后,我们删除访问过的节点:
arraydeque.remove(i);
我在输出中得到的是:
0 0 0 0 0
那么代码在哪里呢?
解决方法
您没有正确处理职位。此代码变异 i
:
int[] c = i; c[0]++;
您似乎认为 c
是数组的副本,但事实并非如此。它仅引用 c
是数组的副本,但事实并非如此。它仅引用 i
引用的数组,因此当您执行 c[0]++
时,该单个数组现在具有该递增值。下次您应用此类代码时(在接下来的 if
块之一中),您将不会从原始位置开始,而是从已经变异的 i
引用的数组,因此当您执行 c[0]++
时,该单个数组现在具有该递增值。下次您应用此类代码时(在接下来的 if
块之一中),您将不会从原始位置开始,而是从已经变异的
老实说,我已经在我对你上一个问题的回答
中指出,使用数组类型位置的想法导致代码不太优雅,现在我们看到用它引入错误是多么容易。如果您使用此类数组,则必须真正构造新数组并复制原始数组的内容。
以下是对这部分代码的更正:🎜
if (i[0] < gridLength - 1) { arrayDeque.add(new int[] {i[0]+1, i[1]}); } if (i[0] > 0) { arrayDeque.add(new int[] {i[0]-1, i[1]}); } if (i[1] < gridLength - 1) { arrayDeque.add(new int[] {i[0], i[1]+1}); } if (i[1] > 0) { arrayDeque.add(new int[] {i[0], i[1]-1}); }
以上是广度优先搜索算法是错误的的详细内容。更多信息请关注PHP中文网其他相关文章!

Q:我有一个问题,我想要监视Linux系统的内存使用情况。在Linux下有哪些可用的视图或命令行工具可以使用呢?A:在Linux系统中,有多种方法可以监视内存使用情况。下面是一些通过视图工具或命令行来查看内存使用情况的方法。/proc/meminfo:最简单的方法是查看/proc/meminfo文件。这个虚拟文件会动态更新,并提供了关于内存使用情况的详细信息。它列出了各种内存指标,可以满足你对内存使用情况的大部分需求。另外,你还可以通过/proc//statm和/proc//status来查看进

“我们将介绍几款适用于Linux系统的白板应用程序,相信这些信息对您会非常有帮助。请继续阅读!”一般来说,数字白板是一种用于大型互动显示面板的工具,常见的设备类型包括平板电脑、大屏手机、触控笔记本和表面显示设备等。当教师使用白板时,您可以使用触控笔、手写笔、手指甚至鼠标在设备屏幕上进行绘画、书写或操作元素。这意味着您可以在白板上拖动、点击、删除和绘画,就像在纸上使用笔一样。然而,要实现这一切,需要有一款软件来支持这些功能,并实现触控和显示之间的精细协调。目前市面上有许多商业应用可以完成这项工作。

一、TensorRT-LLM的产品定位TensorRT-LLM是NVIDIA为大型语言模型(LLM)开发的可扩展推理方案。它基于TensorRT深度学习编译框架构建、编译和执行计算图,并借鉴了FastTransformer中高效的Kernels实现。此外,它还利用NCCL实现设备间的通信。开发者可以根据技术发展和需求差异,定制算子以满足特定需求,例如基于cutlass开发定制的GEMM。TensorRT-LLM是NVIDIA官方推理方案,致力于提供高性能并不断完善其实用性。TensorRT-LL

ZRX(0x)是一个基于以太坊区块链的开放协议,用于实现分布式交易和去中心化交易所(DEX)功能。作为0x协议的原生代币,ZRX可用于支付交易费用、治理协议变更和获取平台优惠。1.ZRX币升值空间展望:从技术角度来看,ZRX作为0x协议的核心代币,在去中心化交易所的应用逐渐增多,市场对其认可度也在增加。以下是几个关键因素,有助于提升ZRX币的价值空间:市场需求潜力大、社区活跃度高、开发者生态繁荣等。这些因素共同促进了ZRX的广泛应用和使用,进而推动了其市场价格的上升。市场需求的增长潜力,意味着更

最近,我正在进行一个项目,遇到了一个问题。在ARM上运行的ThreadX与DSP通信时采用了消息队列的方式传递消息(最终实现使用了中断和共享内存的方法)。然而,在实际的操作过程中,发现ThreadX经常崩溃。经过排查,发现问题出在传递消息的结构体没有考虑字节对齐的问题上。我想顺便整理一下关于C语言中字节对齐的问题,并与大家分享。一、概念字节对齐与数据在内存中的位置有关。如果一个变量的内存地址恰好是它长度的整数倍,那么它就被称为自然对齐。例如,在32位CPU下,假设一个整型变量的地址为0x0000

BOSS直聘怎么创建多个简历?BOSS直聘是很多小伙伴找工作的一大招聘平台,为用户们提供了非常多便利的求职服务。各位在使用BOSS直聘的时候,可以创建多个不同的简历,以便投送到不同的工作岗位上,获取到更高成功率的求职操作,各位如果对此感兴趣的话,就随小编一起来看看BOSS直聘双简历创建教程吧。BOSS直聘怎么创建多个简历1.登录Boss直聘:在您的电脑或手机上,登录您的Boss直聘账户。2.进入简历管理:在Boss直聘首页,点击“简历管理”,进入简历管理页面。3.创建新简历:在简历管理页面,点击

busybox概述众所周知,在Linux环境下,一切皆文件,文件可以表示一切。而文件系统则是这些普通组件的集合。在嵌入式领域中,常常使用基于busybox构建的rootfs来构建文件系统。busybox诞生至今已有近20年的历史,如今已成为嵌入式行业中主流的rootfs构建工具。busybox的代码是完全开源的。你可以进入官方网站,点击”GetBusyBox”下面的”DownloadSource”进入源码下载界面。“官方网站链接:https://busybox.net/”2.busybox的配置

幻兽帕鲁游戏开局就可以拿三个宝箱和两个宠物蛋,拿完以后就可以开始建家了,建家的地址一定要选好,要不然开局会发现自己的家没有了,然后就是捕捉一直适合自己的帕鲁,作为自己的伙伴或者打工人即可。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)