Project Euler 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.

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 长方体路径的更多相关文章
- 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 ...
- Project Euler 126 - Cuboid layers
这题先是推公式… 狂用不完全归纳+二次回归,最后推出这么一个奇怪的公式 \[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\] 表示长宽高为\(x\).\(y\).\ ...
- Python练习题 043:Project Euler 015:方格路径
本题来自 Project Euler 第15题:https://projecteuler.net/problem=15 ''' Project Euler: Problem 15: Lattice p ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- [project euler] program 4
上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Project Euler 9
题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...
- 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 ...
- project euler 169
project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...
随机推荐
- MSSQL优化之——查看语句执行情况
MSSQL优化之——查看语句执行情况 在写SQL语句时,必须知道语句的执行情况才能对此作出优化.了解SQL语句的执行情况是每个写程序的人必不可少缺的能力.下面是对查询语句执行情况的方法介绍. 一.设置 ...
- 有关Mysql连接问题
问题一——Mysql number Error 2003 MySQL连接错误.错误代码10061.10061一般是Mysql服务没启动.或Mysql服务器无法连接 . 在程序栏找到Mysql\Mysq ...
- Ubuntu12.10编译openwrt遇到的错误
由于Openwrt有很多工具是要先编译的,在Ubuntu12.10平台下编译openwrt时就遇到了下面这样的错误:elf.cpp: In static member function 'static ...
- HTTP传递数据的几种方法
Http请求的时候,需要传递参数给后端,一般都是key-value的形式,传递的方法有很多种 例如需要传递的数据是 dict(key1=value1,key2=value2) 1. URL参数 把参数 ...
- JS对Json对象Distinct
Json对象去重 今日有一个需求如下: 从数据库中取出数据源转化成json字符串绑定到隐藏域中,取出的json字符串如下: string data="[{"CompanyName& ...
- 万网域名解析到IP地址
进入https://home.console.aliyun.com/#/的阿里云控制台 再自己购买的域名列表里进行操作 添加一个A解析
- HTTP 错误 404.3 - Not Found
在使用win2012服务器上的IIS发布网页的时候,出现下面的错误 解决办法: 将应用程序开发下的所有功能都安装. 如果上面的方法没解决问题的话,那么看看下图中的这些安装没,没有的话就继续安装.
- Activity的Launch mode详解 singleTask正解
Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity ...
- Eclipse下jad反编译之“类文件查看器”不能处理给定的输入错误解决
Eclipse中的插件下载,安装和配置可以参考我的另一篇文章:MyEclipse反编译Class文件 下面重点讲解如何使用jad反编译 1.在DOS窗口中,到class所在目录,直接运行 >ja ...
- SqlServer维护计划
http://blog.csdn.net/yunye114105/article/details/6594826