题目

创意机器⼈⼤赛——捡硬币。⽐赛规则如下: 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]
信息技术 试题推荐