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.

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,路径如下图所示:

但是,每个立方体都有三条可能的最短路径,而且最终的最短路径并不一定是整数。

考虑所有整数边长的立方体屋子,最大不超过M×M×M,当M=100时一共有2060个立方体的最短路径是整数,而且这也是解超过2000的最小的M;M=99时又1975个立方体的最短路径是整数。

找出解超过一百万的最小的M。

解题

可以直接求的

为了防止在计算的过程中,出现立方体重复的显现,可以假设 a<=b <=c

最短路径有三种:

path1 = (a+b)^2 + c^2

path2 = (a+c)^2 + b^2

path3 = (c+b)^2 + a^2

上面三个值展开后可以发现都含有a b c的平方项,不同项以此是:2ab 2 ac 2bc

显然的发现2ab是最小值,也就是说path1就是最小路径值,判断是不是整数就很简单了。

Java关键程序

    static void run(){
int limit = 1000000;
int count =0;
int M = 1;
for(M = 1;;M++){
// 当 a<= b <= c 最小路径就是 (a+b)*(a+b) + c*c 开根号
for(int a = 1;a<= M ;a++){
for(int b =a ;b<= M;b++){
int c = M ;
int path = (a+b)*(a+b) + c*c;
int tmp = (int)Math.sqrt(path);
if(tmp*tmp == path){
count ++;
}
}
}
if(count> limit){
System.out.println(M);
break;
}
}
}

另外一种方法,参考链接

同样假设:a<=b<=c

最小值是:(a+b)^2 + c^2

可以把 a+b看成一个值ab

显然ab的范围就是[2,2M]

后面就看不懂了。

上面两种放大都是固定c的值,c也是最大值,找出对应c满足条件的 立方体数量,c+1的时候显然是包括c的情况的解。

package Level3;

public class PE086{
static void run(){
int limit = 1000000;
int count =0;
int M = 1;
for(M = 1;;M++){
// 当 a<= b <= c 最小路径就是 (a+b)*(a+b) + c*c 开根号
for(int a = 1;a<= M ;a++){
for(int b =a ;b<= M;b++){
int c = M ;
int path = (a+b)*(a+b) + c*c;
int tmp = (int)Math.sqrt(path);
if(tmp*tmp == path){
count ++;
}
}
}
if(count> limit){
System.out.println(M);
break;
}
}
}
static void run2() {
int limit = 1000000; int c = 1;
int count = 0;
while(count < limit){
c++;
for(int ab = 2;ab<= 2*c;ab++){
int path = ab*ab + c*c;
int tmp = (int)Math.sqrt(path);
if(tmp*tmp== path){
count += (ab>=c)?1+(c-(ab+1)/2):ab/2;
}
}
// if(c ==100)
// System.out.println(count);
}
System.out.println(c);
} public static void main(String[] args){
long t0 = System.currentTimeMillis();
run2();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms"); }
}

1818
running time=0s39ms

 

Python 时间有点长

# coding=gbk
import time as time t0 = time.time()
print 3**2
print int(8**0.5)
def run():
limit = 1000000
count = 0
M = 1
while count < limit:
for a in range(1,M+1):
for b in range(a,M+1):
c = M
path = (a+b)**2 + c**2
tmp = int((path)**0.5)
if tmp**2 == path:
count +=1
M += 1 print M-1 # 1818
# running time= 1062.27400017 s run()
t1 = time.time()
print "running time=",(t1-t0),"s"

Project Euler 86:Cuboid route 长方体路径的更多相关文章

  1. Project Euler: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 o ...

  2. Project Euler 126 - Cuboid layers

    这题先是推公式… 狂用不完全归纳+二次回归,最后推出这么一个奇怪的公式 \[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\] 表示长宽高为\(x\).\(y\).\ ...

  3. Python练习题 043:Project Euler 015:方格路径

    本题来自 Project Euler 第15题:https://projecteuler.net/problem=15 ''' Project Euler: Problem 15: Lattice p ...

  4. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  5. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  6. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  7. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  8. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

  9. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

随机推荐

  1. 8款实用的Jquery瀑布流插件

    1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...

  2. Tomcat启动超时

    当启动tomcat时候出现 Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the s ...

  3. Docker无法启动 Could not find a free IP address range for interface 'docker0' 最方便的解决办法

    阿里云的CentOS 6.5上安装Docker会无法启动,如果直接运行docker -d会看到错误提示:Could not find a free IP address range for inter ...

  4. 通过百度地图API实现搜索地址--第三方开源--百度地图(三)

    搜索地址功能是建立在能够通过百度地图API获取位置的基础上 通过百度地图定位获取位置详情:http://www.cnblogs.com/zzw1994/p/5008134.html package c ...

  5. Jquery插件收集

    移动端滚动条插件iScroll.js http://www.cnblogs.com/starof/p/5215845.html http://www.codeceo.com/article/35-jq ...

  6. SQL中的模糊查询

    写个标题先.先来一篇大神的文章:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921914.html 练习代码如下: 1.百分号:%   表示任 ...

  7. Translation perface: <<Professional JavaScript for Web Developers, 3rd Edition>>

    It is a huge pitty to breaking translating this book. Sincerly speaking, I am striken by this great ...

  8. 二,WPF的布局

    所有WPF布局窗口都派生自System.WIndows.Controls.Panel抽象类的面板. 不能在布局容器中放置字符串内容,而是需要一个继承自UIElement的类对字符串进行包装,如Text ...

  9. Microsoft .NET Framework 3.5 for Windowns Server2012R2 GUI

    图形化安装,需要安装盘,不需要网络连接

  10. IIS支持PHP

    1. 解压php-5.2.6.zip到D:\php5,找到php.ini-dist改名为php.ini并将它放到C:\WINDOWS目录下. 2. 将D:\ php5目录下的libmcrypt.dll ...