如何检查遍历是否已达到 Java 中二维数组中的某个索引?

How to check if a traversion has reached a certain Index in a 2D-Array in Java?

假设我们有一个二维布尔数组作为迷宫的展示,数组的大小不是固定的并且是随机的。墙壁被描绘成真实的:

boolean[][] mazeArray = new boolean[width][height];

迷宫的出口在一个固定的索引处。如何检查遍历是否达到某个指标? 我的想法是创建一个 int[ ] 来跟踪位置,每一步都会更新和覆盖它:

int[] location = {1,0};

...但我不明白为什么我在 while 循环中的检查不起作用:

while( location[0] != (maze[0].length-1) && location[1] != (maze[1].length-2) ) {
   // traversion with pledge algorithm
    }

您的代码存在的问题是您在 maze 数组中检查了错误的项目:

  • maze[0] 是二维数组的第一“行”
  • maze[1] 是二维数组的第二条“线”

遍历二维数组的正确方法如下(我用单独的 xy 变量替换了你的 location 数组,以更好地可视化算法)。

我的算法是逐行输入2dmazeArray,然后迭代每一行的元素。

public class Maze {
    public static void main(String[] args) {
        int width = 20;
        int height = 20;

        boolean[][] mazeArray = new boolean[width][height];

        int x = 0;
        int y = 0;

        while (y < mazeArray.length) {
            while (x < mazeArray[y].length) {
                System.out.println("Traverse at (" + x + ", " + y + ")");

                x += 1;
            }

            x = 0;
            y += 1;
        }
    }
}

你让自己的一切变得更难了。走更简单的路。

使用更简单的位置处理

而不是位置[],simlpy 使用int destinyXint destinyY。作为您当前的位置,您应该使用 int positionXint positionY.

如果您更喜欢 OO-stlye,或者可能想为 3D 或 n-D 的解决方案敞开大门,您可以引入一个具有 X 的位置 class和 Y,所有移动和检查都可以由 class 处理。然后你会得到 Location targetLocation = new Location(x,y); 和你当前的位置 Location currentPosition = new Location(x,y);。然后你可以检查 if (currentPosition.equals(targetLocation))...; 或者你的情况 while(!currentPosition.equals(targetLocation)) {...}

看来您误解了 array.length 函数,或者您使用它的方式非常不方便。

此刻你正在盲目地射击迷宫[]的阵列长度。这很糟糕,原因有两个:

  1. 数组长度不应与数组内的位置有任何关系(逻辑悖论),并且
  2. 因为你永远无法自由移动你的目的地,所以它总是粘在迷宫的右边或底部外面

使用上面的定位,这将解决这个问题。

建议:使用 byte[][]enum[][] 迷宫

目前,您只知道某个位置是否有墙。如果你想包括其他元素,如水、宝藏或目标位置、虫洞等,那么你应该:

  • 使用 byte[][] 并用值填充它
    • 值 0 可能是通路
    • 值 1 可能是墙
    • 值 2 可能是出口
    • 值 3 可能是水等
  • 使用常量,例如static public final int WATER_CODE = 3;

或者,创建您自己的枚举:

public enum LocationType {PATH, WALL,EXIT,WATER}

然后让迷宫变成这样:

LocationType[][] mazeArray = new LocationType[width][height];

一开始一切都是PATH,你可以这样设置WALLS:

mazeArray[x][y] = LocationType.WALL;

或水:

mazeArray[x][y] = LocationType.WATER;

使用class或迷宫界面[][]

为了 Wormhole 或扩展功能,您还可以使用 class 而不是枚举:

abstract class LocationType {}

然后实现某些类型,比如

class Wall extends LocationType {}

甚至

class Wormhole extends LocationType {
    public Location leadsTo() { /* */ };
}

class Treasure extends LocationType {
    public int getAmoundOfGoldCoinsFound() { /* */ };
}

如果您将 LocationType 实现为接口,请将 'extends' 替换为 'implements'