Java 在二维数组中查找最近的可访问数字

Java 在二维数组中查找最近的可访问数字,java,algorithm,Java,Algorithm,我有一个包含数字的2d数组。它可能是这样的: 11211 1 31 1 111 1 11 13111 数字1是“墙”,2是入口,3是我们想要到达的点。正如你所看到的,我们有两个3的出现,它们并不相同。我需要找到最近的一个。请记住,输入数组是随机的,不必像这样 我在思考如何解决这个问题: 先找到入口。这只能在O(n^2)(最坏情况)时间内完成,因为入口可能位于阵列中的任何位置,并且不必沿着边缘。我可以毫无问题地实现这一点 然后我需要从数组中的入口点进行搜索。每当我找到数字3时,我都需要记住我

我有一个包含数字的2d数组。它可能是这样的:

11211
1  31
1 111
1  11
13111
数字1是“墙”,2是入口,3是我们想要到达的点。正如你所看到的,我们有两个3的出现,它们并不相同。我需要找到最近的一个。请记住,输入数组是随机的,不必像这样

我在思考如何解决这个问题: 先找到入口。这只能在O(n^2)(最坏情况)时间内完成,因为入口可能位于阵列中的任何位置,并且不必沿着边缘。我可以毫无问题地实现这一点

然后我需要从数组中的入口点进行搜索。每当我找到数字3时,我都需要记住我访问过它,以及点之间的距离(示例中的2和3)。假设我找到离入口最远的3号。这显然不是最接近的点(如果我们看示例的话)。我需要跳回入口,再次搜索。我想用一种实时计数器,数数步数,这样如果我比刚找到的宝藏走的步数更多,我就会停下来说之前找到的宝藏是最接近的

我认为有一种更好的方法可以有效地实现它,但我真的想不出怎么做。我尝试搜索Dijkstra的算法,但它似乎找到了从入口到数组中所有数字的最短路径(数字是目标数字3)。我想你可以过滤掉其中最短的一个,但是你到底要如何在Java中实现呢

我不是在寻找完整的代码,而是寻找一些指导我的东西,以便我能够理解如何实现它。

假设“距离”是指在空白处行走

  • 从入口开始,让元素向左、向上、向下和向右移动,如果已经标记为已访问,则不要进入。如果你看到一堵墙或撞到了边缘,标记它并忽略它。如果您看到一个空白,请将元素放入队列中

  • 标记所访问的入口

  • 从(1)中的队列中退出元素

  • 使用出列元素作为新的“入口”,重复(1)-(3),直到点击
    3
    ,在这种情况下,停止。
    3
    是离入口最近的

  • 如果您没有遇到任何
    3
    ,并且您已经在(1)中访问了所有内容,这意味着从入口无法访问
    3

  • 这是的一个实例,使用的技术与


    此外,如果且仅当有多个
    3
    具有相同且最短的距离时,您在(1)中访问的方向可能会影响最终结果。

    我喜欢贝尔曼·福特解决此类问题。当然是N^3(在本例中),但它很容易实现

    就你而言:

    设置 创建一个2D数组“最短距离”,并用无穷大填充它。 遍历阵列,在有门的位置将“最短距离”设置为0。这些是网格点,我们可以在0距离内到达

    算法

    For itr in 0 to N // (Max Distance between any door and For i in 0 to N // row index For j in 0 to N //column number If Grid[i][j] == 1 Continue; //its a wall and it can't propagate shortest distance else ShortestDistance[i][j] = min( ShortestDistance[i][j], //current value 1 + (ShortestDistance among all neighbours*) //reduced shortest path. 对于0到N的itr/(任何门和门之间的最大距离) 对于0到N//行索引中的i 对于0到N中的j//列号 如果网格[i][j]==1 Continue;//它是一堵墙,不能传播最短距离 其他的 最短距离[i][j]=min( 最短距离[i][j],//当前值 1+(所有邻居之间的最短距离*)//缩短的最短路径。 *在每一步中,我们都通过到达某个位置的最短距离+1或当前值本身来更新到达该位置的最短距离

    后处理
    通过最短距离2D数组,打印与“3”类型点对应的最小值。

    我知道从入口可以有两个距离相等的元素。如果是这种情况,我只需要选择其中一个。但是感谢您的评论