import math
print ('''
.Fire
|
|
watch tower . |
| |C
| |
A| |
| |
|________B_________|
====================
canal
''')
A= (int(input('please give A a value ')))
B= (int(input('please give B a value ')))
C= (int(input('please give C a value ')))
def Hypotenus1_2():
x=(int(0))
y=math.sqrt((int(A)*int(A))+(int(x)*int(x)))+math.sqrt((int(A)-int(x))* (int(A)-int(x))+(int(C)*int(C)))
while x<B:
x=x+1
y=math.sqrt((int(A)*int(A))+(int(x)*int(x)))+math.sqrt((int(A)-int(x))*(int(A)-int(x))+(int(C)*int(C)))
dpY=(round((y),1))
z=math.sqrt(((int(B)-(int(x)))*(int(B)-(int(x))))+(int(C)*int(C)))
dpZ=(round((z),1))
print (round((dpZ+dpY),1))
Hypotenus1_2()
&#13;
请注意我使用的是python 3.4.3。
好吧所以我试图找到从观察塔到运河到火的最小可能路线,并且这样做我必须找到斜边并将相应的斜边添加在一起。
然而,随着x的每个值改变,dpZ和dpY也会在每次迭代时加在一起,以便找到最小路径。我将hypotenuses的值加在一起,可以看到最低的路线,但不能只取最小值。
到目前为止,这些是我对代码的结果。
>>>
.Fire
|
|
watch tower . |
| |C
| |
A| |
| |
|________B_________|
====================
canal
please give A a value 3
please give B a value 10
please give C a value 5
18.8
18.1
17.8
17.9
18.3
18.9
19.8
21.0
22.4
24.0
>>>
&#13;
答案 0 :(得分:0)
听起来您希望在每次迭代时保存最佳解决方案。这些方面的东西:
import math
shortest = 0
best = 1000000
for i in range (0, B):
hypAB = math.hypot(A, i)
hypBC = math.hypot(i, C)
shortest = min(hypAB + C, hypBC + A)
if shortest < best:
best = shortest
print (best)
答案 1 :(得分:0)
这是一个分析解决方案:
x
点[0 .. B]
点,总路径L
为(A**2 + x**2)**0.5 + ((B - x)**2 + C**2)**0.5
L
时出现分钟dL/dx == 0
dL/dx = 0.5 * (A**2 + x**2)**-0.5 * 2*x
+ 0.5 * ((B - x)**2 + C**2)**-0.5 * 2 * (B - x) * -1
= x / (A**2 + x**2)**0.5 - (B - x) / ((B - x)**2 + C**2)**0.5
如果dL/dx == 0
,
x / (A**2 + x**2)**0.5 == (B - x) / ((B - x)**2 + C**2)**0.5
# square both sides
x**2 / (A**2 + x**2) == (B - x)**2 / ((B - x)**2 + C**2)
# multiply both sides by (A**2 + x**2) * ((B - x)**2 + C**2)
x**2 * ((B - x)**2 + C**2) == (B - x)**2 * (A**2 + x**2)
# expand and collect terms
(C**2 - A**2) * x**2 + (2 * A**2 * B) * x + (- A**2 * B**2) == 0
是二次的;使用二次公式和减少,我们得到
x = A * B / (A + C)
L = ((A + C)**2 + B**2)**0.5