【发布时间】:2017-08-10 23:43:31
【问题描述】:
问题 15:
从 2×2 网格的左上角开始,有 6 条路线(没有回溯)到右下角。
通过 20×20 的网格有多少条路线?
所以我在Problem 15 的尝试有点暴力,因为我尝试通过从右到左并更改第一次方向改变的前身来获得所有可能有效路径的排列。例如,当我有一个 2x2 网格时(查看问题 15 链接图形),我将采用的第一条路径是右 - 右 - 下 - 下,我将采用的最后一条路径是 down - down - right - right,这也是我的终止条件。我将可能的有效路径添加到一个列表中,并使用该列表来确定是否已经添加了有效路径。为了置换路径,我将执行前面提到的操作:我在数组中从右到左(图中箭头指向的右下角)并更改第一个元素下一个元素与自身不同。所以right - right - down - down会变成right - right - right - down,这显然是无效的,因为你必须拥有相同数量的rights和downs能够到达终点角。所以我的想法是制作另一个从左到右的循环,并根据需要更改尽可能多的元素以获得有效路径。所以在这个例子中 right - right - right - down 变成 down - right - right - down。
另外,我忘了我不是在计算点数,我是在计算从左上角到右下角的边缘。
所以我已经写了一些代码,但它根本不起作用。
package projecteuler;
import java.util.ArrayList;
public class Projecteuler {
public static final int GRIDSIZE = 2;
public static void main(String[] args) {
ArrayList<boolean[]> paths = new ArrayList<>();
paths.add(new boolean[GRIDSIZE * 2]);
for(int i = 0; i < GRIDSIZE; i++) {
paths.get(0)[i] = true;
paths.get(0)[GRIDSIZE * 2 - 1 - i] = false;
}
boolean[] buf = paths.get(0).clone();
printArr(buf);
boolean tmp;
while(!checkTerminate(paths)) {
while(paths.contains(buf)) {
tmp = buf[buf.length - 1];
for(int i = buf.length - 1; buf[i - 1] != tmp && 0 < i; i--) {
buf[i] = !buf[i];
for(int j = 0; checkValid(buf) && j < i; j++)
buf[j] = !buf[j];
}
}
paths.add(buf.clone());
printArr(buf);
}
System.out.println(paths.size());
}
public static boolean checkTerminate(ArrayList<boolean[]> paths) {
boolean[] endPath = new boolean[GRIDSIZE * 2];
for(int i = 0; i < GRIDSIZE; i++) {
endPath[i] = false;
endPath[GRIDSIZE * 2 - 1 - i] = true;
}
return paths.contains(endPath);
}
public static boolean checkValid(boolean[] arr) {
int countR = 0,
countL = 0;
for(int i = 0; i < arr.length; i++)
if(arr[i])
countR++;
else
countL++;
return countR == countL;
}
public static void printArr(boolean[] arr) {
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] ? "right " : "down ");
System.out.println();
}
}
不知何故,它不会改变任何地方。
right right down down
right right down down
right right down down
right right down down ...
等等就是它的全部输出。似乎代码根本不会改变我的路径,但也不会卡在任何 for 循环中。我最好的猜测是我的函数标准放置在错误的顺序中
我也想过一个回溯的解决方案,就像我们两年前在学校为迷宫做的那样,但我想在重做所有事情之前看看这种方法是否可行。
编辑:
我会尽快实现 2 x 2 网格示例的图像,但 ProjectEuler 网站目前正在维护中。
【问题讨论】:
-
最后,一个编程挑战问题展示了在发布之前解决问题的实际努力......
-
这个问题写的非常糟糕。尽管您在 Stack Overflow 上发布问题之前已经做出了必要的努力,但帖子的标题和您描述问题的方式是荒谬的:您不应该假设人们已经知道您正在谈论的问题.与真正问题的外部链接是不可接受的。编辑帖子并在此处的描述中包含所有必要的详细信息,并将标题修改为实际简要描述真实问题的内容。
-
@meowgoesthedog 感谢您注意到我的努力,但不知何故人们仍在对我的帖子投反对票。也许我的方法太愚蠢了,甚至没有被认真对待哈哈
-
@LordScrat 没有人会因为“糟糕的方法”而对您的帖子投反对票。我们都在这里帮助彼此学习。
-
请注意,该问题仅要求您计数路线,而不是实际构建每条路线。计算它们要容易得多。