Java 如何在多维数组中找到所有可能的递增顺序路径?
我想知道查找多维数组的所有可能路径的Java代码。我们应该从Java 如何在多维数组中找到所有可能的递增顺序路径?,java,traversal,Java,Traversal,我想知道查找多维数组的所有可能路径的Java代码。我们应该从[0][0]节点开始前进。要记住的是,无论元素的顺序如何,路径都必须是递增的。 如果下一个元素等于(或小于)当前元素,则不应遍历 示例阵列: 结果: 我认为下面的代码与您描述的一样。它开始检查第一个节点(0,0)。对于检查的每个节点,将创建一个邻居向量。相邻节点是有资格作为路径的延续的节点(即表中具有较高值的相邻节点)。然后对每个邻居克隆路径,并检查新邻居。这将继续进行,直到选中的节点没有合格的邻居,此时将打印路径并终止算法 试试这个:
[0][0]
节点开始前进。要记住的是,无论元素的顺序如何,路径都必须是递增的。
如果下一个元素等于(或小于)当前元素,则不应遍历
示例阵列:
结果:
我认为下面的代码与您描述的一样。它开始检查第一个节点(0,0)。对于检查的每个节点,将创建一个邻居向量。相邻节点是有资格作为路径的延续的节点(即表中具有较高值的相邻节点)。然后对每个邻居克隆路径,并检查新邻居。这将继续进行,直到选中的节点没有合格的邻居,此时将打印路径并终止算法 试试这个:
import java.util.Arrays;
import java.util.Vector;
class Main {
class Coords {
int x;
int y;
Coords(int x, int y) {
this.x = x;
this.y = y;
}
}
int [][] array = { {3,5,1},{6,7,4},{8,2,9}};
Vector<Coords> getNeighbors(Coords coords) {
int x = coords.x;
int y = coords.y;
Vector<Coords> result = new Vector<Coords>();
if (x < array.length - 1) {
if (array[x + 1][y] >= array[x][y])
result.add(new Coords(x + 1, y));
}
if (x > 0) {
if (array[x - 1][y] >= array[x][y])
result.add(new Coords(x - 1, y));
}
if (y < array[x].length - 1) {
if (array[x][y + 1] >= array[x][y])
result.add(new Coords(x, y + 1));
}
if (y > 0) {
if (array[x][y - 1] >= array[x][y])
result.add(new Coords(x, y - 1));
}
if (x < (array.length - 1 ) && (y < array[x].length - 1)) {
if (array[x + 1][y + 1] >= array[x][y])
result.add(new Coords(x + 1, y + 1));
}
if (x < (array.length - 1 ) && (y > 0)) {
if (array[x + 1][y - 1] >= array[x][y])
result.add(new Coords(x + 1, y - 1));
}
if (x > 0 && (y < array[x].length - 1)) {
if (array[x - 1][y + 1] >= array[x][y])
result.add(new Coords(x - 1, y + 1));
}
if (x > 0 && y > 0) {
if (array[x -1][y - 1] >= array[x][y])
result.add(new Coords(x - 1, y - 1));
}
return result;
}
void checkNode(Vector<Integer> path, Coords coords) {
path.add(array[coords.x][coords.y]);
Vector<Coords> neighbors = getNeighbors(coords);
if (neighbors.size() == 0) {
for (Integer i : path) {
System.out.print(i+"\t");
}
System.out.println();
}
for (Coords c : neighbors) {
Vector<Integer> newpath = (Vector<Integer>) path.clone();
checkNode(newpath, c);
}
}
Main() {
System.out.println ("Array: " + Arrays.deepToString(array));
checkNode(new Vector<Integer>(),new Coords(0,0));
}
public static void main(String args[]) {
new Main();
}
}
它还提供了路径3、6、8,它不在示例输出中您应该从起点开始构建一棵树。在示例数组中,从左上角开始,树可能如下所示:
3
/ \ \
5 6 7
/ \ \ \
7 6 .. ..
一旦你有了那棵树,你只需要沿着树上的每一条路走下去
尽管看起来很吓人,但您可以将其分为两部分:
- 建造这棵树
- 沿着小路走
- 首先,试着想出一种方法,让你的出发点打印出来。 那相当容易
- 一旦你做到了这一点,打印你的起点的邻居 点>其值
- 然后,对每个邻居做同样的事情
import java.util.Arrays;
import java.util.Vector;
class Main {
class Coords {
int x;
int y;
Coords(int x, int y) {
this.x = x;
this.y = y;
}
}
int [][] array = { {3,5,1},{6,7,4},{8,2,9}};
Vector<Coords> getNeighbors(Coords coords) {
int x = coords.x;
int y = coords.y;
Vector<Coords> result = new Vector<Coords>();
if (x < array.length - 1) {
if (array[x + 1][y] >= array[x][y])
result.add(new Coords(x + 1, y));
}
if (x > 0) {
if (array[x - 1][y] >= array[x][y])
result.add(new Coords(x - 1, y));
}
if (y < array[x].length - 1) {
if (array[x][y + 1] >= array[x][y])
result.add(new Coords(x, y + 1));
}
if (y > 0) {
if (array[x][y - 1] >= array[x][y])
result.add(new Coords(x, y - 1));
}
if (x < (array.length - 1 ) && (y < array[x].length - 1)) {
if (array[x + 1][y + 1] >= array[x][y])
result.add(new Coords(x + 1, y + 1));
}
if (x < (array.length - 1 ) && (y > 0)) {
if (array[x + 1][y - 1] >= array[x][y])
result.add(new Coords(x + 1, y - 1));
}
if (x > 0 && (y < array[x].length - 1)) {
if (array[x - 1][y + 1] >= array[x][y])
result.add(new Coords(x - 1, y + 1));
}
if (x > 0 && y > 0) {
if (array[x -1][y - 1] >= array[x][y])
result.add(new Coords(x - 1, y - 1));
}
return result;
}
void checkNode(Vector<Integer> path, Coords coords) {
path.add(array[coords.x][coords.y]);
Vector<Coords> neighbors = getNeighbors(coords);
if (neighbors.size() == 0) {
for (Integer i : path) {
System.out.print(i+"\t");
}
System.out.println();
}
for (Coords c : neighbors) {
Vector<Integer> newpath = (Vector<Integer>) path.clone();
checkNode(newpath, c);
}
}
Main() {
System.out.println ("Array: " + Arrays.deepToString(array));
checkNode(new Vector<Integer>(),new Coords(0,0));
}
public static void main(String args[]) {
new Main();
}
}
Array: [[3, 5, 1], [6, 7, 4], [8, 2, 9]]
3 6 8
3 6 7 9
3 6 7 8
3 5 7 9
3 5 7 8
3 5 6 8
3 5 6 7 9
3 5 6 7 8
3 7 9
3 7 8
3
/ \ \
5 6 7
/ \ \ \
7 6 .. ..