题目
创意机器⼈⼤赛——捡硬币。⽐赛规则如下:
1)在⽐赛场地上放置了n个硬币,每个硬币的位置均不相同,各位置坐标(x,y)保存在⽂本⽂件中(如图所示,放置了5个硬币,⽂本中坐标按x,y升序排列);
2)机器⼈在两个硬币位置间⾛直线,从起点(0,0)出发,按硬币x坐标从⼩到⼤去捡,若x坐标相同,则按y坐标从⼩到⼤捡;取⾛其中的n-1个硬币,总⾏⾛距离最短的机器⼈将获得⽐赛的冠军。
例:如图a所示,p2直接到p4则代表p3处硬币未取。
图a
图b
图c
完成该项⽬分以下⼏个步骤:
(1)
读取坐标数据。
从⽂本⽂件中读取硬币的坐标(x、y),分别存储在列表 x 和y 中。请在划线处填⼊合适的代码。
f=open("position.txt",'r') #从⽂件中读取坐标位置
x=[0]; y=[0] #将原点坐标分别存储在x、y 列表中
line=f.readline() #取出一⾏数据
#从⽂本⽂本中读取硬币的位置,并存储在 x、y 列表中
while line:
data=line.split(",") #以逗号为分隔符转换成列表
x.append(int(data[0]))
line=f.readline( )
f.close() #关闭⽂件
(2)
编写函数,计算两点间的距离。请在划线处填⼊合适的代码。
from math import sqrt
def dist(x1,y1,x2,y2): #计算(x1,y1)到(x2,y2)的距离
d=
return d
(3)
设计算法与程序实现。
机器⼈取⾛n-1个硬币经过的最短距离公式可以描述为:
其中:为机器⼈取⾛n-1个硬币⾛的最短距离;为机器⼈取⾛n个硬币经过的距离之和;为机器⼈未取第i个硬币少⾛的路程;Max为求中的最⼤值。
根据上述算法编写的Python程序如下,请在划线处填⼊合适的代码。
n=len(x) : long=0
for i in range(1, n):
long=long+dist(x[i-1], y[i-1], x[i], y[i])
ansi=n-1
for i in range(2, n):
d1=dist(x[i-2],y[i-2],x[i-1],y[i-1])
d2=dist(x[i-1],y[i-1],x[i],y[i])
d3=dist(x[i-2],y[i-2],x[i],y[i])
dx= #计算未取第i-1 个硬币少⾛的路程。
if dx>maxd:
maxd=dx
ansi=i-1
print("机器⼈⾏⾛的最短距离为:"+str(round(, 4))) print("未取⾛的硬币的位置为:(",x[ansi],",",y[ansi],")")
(4)
调试和异常处理
当最后一个硬币未取为最短距离时,上述程序运⾏结果不正确。加框处代码有误,请修改。
答案: 【1】y.append(int(data[1]))
【1】sqrt((x2-x1)**2+(y2-y1)**2)或sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))或((x2-x1)**2+(y2-y1)**2)**0.5
【1】d1+d2-d3【2】long-maxd
maxd=dist(x[n-2],y[n-2],x[n-1],y[n-1]