1)在比赛场地上放置了n个硬币,每个硬币的位置均不相同,各位置坐标(x,y)保存在文本文件中(如图所示,放置了5个硬币,文本中坐标按x,y升序排列);
2)机器人在两个硬币位置间走直线,从起点(0,0)出发,按硬币x坐标从小到大去捡,若x坐标相同,则按y坐标从小到大捡;取走其中的n-1个硬币,总行走距离最短的机器人将获得比赛的冠军。
例:如图a所示,p2直接到p4则代表p3处硬币未取。
图a
图b
图c
完成该项目分以下几个步骤:
从文本文件中读取硬币的坐标(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() #关闭文件
from math import sqrt
def dist(x1,y1,x2,y2): #计算(x1,y1)到(x2,y2)的距离
d=
return d
机器人取走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],")")
当最后一个硬币未取为最短距离时,上述程序运行结果不正确。加框处代码有误,请修改。