如何检查遍历是否已达到 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]
是二维数组的第二条“线”
遍历二维数组的正确方法如下(我用单独的 x
和 y
变量替换了你的 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 destinyX
和int destinyY
。作为您当前的位置,您应该使用 int positionX
和 int 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
函数,或者您使用它的方式非常不方便。
此刻你正在盲目地射击迷宫[]的阵列长度。这很糟糕,原因有两个:
- 数组长度不应与数组内的位置有任何关系(逻辑悖论),并且
- 因为你永远无法自由移动你的目的地,所以它总是粘在迷宫的右边或底部外面
使用上面的定位,这将解决这个问题。
建议:使用 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'
假设我们有一个二维布尔数组作为迷宫的展示,数组的大小不是固定的并且是随机的。墙壁被描绘成真实的:
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]
是二维数组的第二条“线”
遍历二维数组的正确方法如下(我用单独的 x
和 y
变量替换了你的 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 destinyX
和int destinyY
。作为您当前的位置,您应该使用 int positionX
和 int 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
函数,或者您使用它的方式非常不方便。
此刻你正在盲目地射击迷宫[]的阵列长度。这很糟糕,原因有两个:
- 数组长度不应与数组内的位置有任何关系(逻辑悖论),并且
- 因为你永远无法自由移动你的目的地,所以它总是粘在迷宫的右边或底部外面
使用上面的定位,这将解决这个问题。
建议:使用 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'