试题编号: | 202009-1 |
试题名称: | 称检测点查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 输入共 n+1 行。 第一行包含用空格分隔的三个整数 n、X 和 Y,表示检测点总数和市民所在位置。 第二行到第 n+1 行依次输入 n 个检测点的坐标。第 i+1 行(1≤i≤n)包含用空格分隔的两个整数 xi 和 yi,表示 i 号检测点所在位置。 输出共三行,按距离从近到远,依次输出距离该市民最近的三个检测点编号。 3 2 2 1 5 0 1 2 全部的测试点满足,3≤n≤200,所有坐标均为整数且绝对值不超过 1000。 市民到第 i 号检测点的距离 Di 可由如下公式算出: Di2=(X−xi)2+(Y−yi)2 |
算法逻辑
这道题有许多的解题方式,此文章以多重链表为主,利用多重链表可以存储多个数据的优势来解题
第一步
建立一个多重链表用于存储检测点的序号以及市民与检测点的距离
class node:
def __init__(self,num,value):
self.data = value
self.num = num
self.next = None
class linked_list:
def __init__(self):
self.head = None
def insert(self,num,value):
new_node = node(num,value)
if self.head == None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def display(self):
if self.head == None:
return
else:
current = self.head
while current.next:
print(f"{current.num}.",current.data,end = "\n")
current = current.next
print(f"{current.num}.",current.data)
PS:多重链表必须能够按照题目要求返回检测点的序号(返回检测点序号代码)
def return_num(self,num):
if self.head == None:
return
else:
count = 0
current = self.head
while count < num:
current = current.next
count += 1
return current.num
第二步
建立排序算法(任意排序,这里以冒泡排序为例)排序检测点的距离
PS:排序时检测点序号也将发生变换,因为最后输出的就是排序后的检测点序号
def bubble_sort(self):
if self.head is None:
return
end = None
while end != self.head:
current_0 = self.head
current_1 = current_0.next
swapped = False
while current_1 != end:
if current_0.data > current_1.data:
current_0.data, current_1.data = current_1.data, current_0.data
current_0.num, current_1.num = current_1.num, current_0.num
swapped = True
current_0 = current_0.next
current_1 = current_1.next
end = current_0
if not swapped:
break
第三步
进行输入,计算与市民的距离后将得到的数据插入到多重链表当中,随后执行排序操作
此时将得到一份按照题目要求排列好的链表,只需将链表的序号按要求返回即可
num,main_x,main_y = list(map(int,input().split()))
list_0 = linked_list()
for i in range(num):
x,y = list(map(int,input().split()))
distance = ((main_x - x) ** 2 + (main_y - y) ** 2) ** 0.5
list_0.insert(i + 1 ,distance)
list_0.bubble_sort()
print("输出为:")
for i in range(3):
print(list_0.return_num(i))
完整代码
class node:
def __init__(self,num,value):
self.data = value
self.num = num
self.next = None
class linked_list:
def __init__(self):
self.head = None
def insert(self,num,value):
new_node = node(num,value)
if self.head == None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def display(self):
if self.head == None:
return
else:
current = self.head
while current.next:
print(f"{current.num}.",current.data,end = "\n")
current = current.next
print(f"{current.num}.",current.data)
def return_num(self,num): # 多重链表必须能够按照题目要求返回检测点的序号(返回检测点序号代码)
if self.head == None:
return
else:
count = 0
current = self.head
while count < num:
current = current.next
count += 1
return current.num
def bubble_sort(self):
if self.head is None:
return
end = None
while end != self.head:
current_0 = self.head
current_1 = current_0.next
swapped = False
while current_1 != end:
if current_0.data > current_1.data:
current_0.data, current_1.data = current_1.data, current_0.data
current_0.num, current_1.num = current_1.num, current_0.num
swapped = True
current_0 = current_0.next
current_1 = current_1.next
end = current_0
if not swapped:
break
num,main_x,main_y = list(map(int,input().split()))
list_0 = linked_list()
for i in range(num):
x,y = list(map(int,input().split()))
distance = ((main_x - x) ** 2 + (main_y - y) ** 2) ** 0.5
list_0.insert(i + 1 ,distance)
list_0.bubble_sort()
print("输出为:")
for i in range(3):
print(list_0.return_num(i))