Problem 86
Cuboid route
A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the opposite corner. By travelling on the surfaces of the room the shortest “straight line” distance from S to F is 10 and the path is shown on the diagram.
![](https://projecteuler.net/project/images/p086.gif)
However, there are up to three “shortest” path candidates for any given cuboid and the shortest route doesn’t always have integer length.
It can be shown that there are exactly 2060 distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is 1975.
Find the least value of M such that the number of solutions first exceeds one million.
长方体路径
蜘蛛S位于一个6乘5乘3大小的长方体屋子的一角,而苍蝇F则恰好位于其对角。沿着屋子的表面,从S到F的最短“直线”距离是10,路径如下图所示:
![](https://projecteuler.net/project/images/p086.gif)
然而,对于任意长方体,“最短”路径实际上一共有三种可能;而且,最短路径的长度也并不一定为整数。
当M=100时,若不考虑旋转,所有长、宽、高均不超过M且为整数的长方体中,对角的最短距离是整数的恰好有2060个;这是使得该数目超过两千的最小M值;当M=99时,该数目为1975。
找出使得该数目超过一百万的最小M值。
package projecteuler;
import junit.framework.TestCase;
public class Prj86 extends TestCase {
public static final int LIMIT = 1000000;
public void testCuboidRoute() {
int count = 1975;
int len = 99 + 1;
// len >= width >= height
boolean find = false;
for (;; len++) {
for (int width = 2; width <= len; width++) {
for (int height = 1; height <= width; height++) {
if (height == width && height == len) {
continue;
}
if (isSquare((int) (Math.pow(len, 2) + Math.pow(width
+ height, 2)))) {
count++;
}
if (count >= LIMIT) {
find = true;
break;
}
}
if (find) {
break;
}
}
if (find) {
break;
}
String fstr = "count=%d,M=%d";
fstr = String.format(fstr, count, len);
System.out.println(fstr);
}
String fstr = "count=%d,M=%d";
fstr = String.format(fstr, count, len);
System.out.println(fstr);
}
boolean isSquare(int num) {
int val = (int) Math.sqrt(num);
return val * val == num;
}
}