【python 模拟卷A实操题16 机器人集合】全国高校计算机能力挑战赛

这里提供一些选择题知识点整理

16、机器人遍历最小值

原题

  • 集合位置多个机器人分布在M*N(10≤M,N≤1000)的方格中,一个方格可能有多个机器人。
  • 规定每个机器人只能向上下左右的相邻方格移动,每移动一个方格需要消耗1个单位能量。
  • 现在要求所有机器人集合,集合点只能是某个机器人初始所在方格。现在请找一个集合点,使得所有机器人到达该点消耗的总能量最低。
  • 输入说明:第一行是一个整数K(0<K≤100),表示有机器人的方格数量。之后K行表示初始状态有机器人的方格位置(x,y|1≤x<M,1≤y<N)和方格内的机器人数量n,以空格隔开。

输出没有说明,猜测要最佳目标点和最低能量
格式可能是列表,可能有其他要求

读题:

1.取值范围

10≤M,N≤1000

不涉及数值溢出
也就是可以暴力的把每一个都算一遍,然后找出最小的那个,也就是用遍历

整数K(0<K≤100)

整数范围之内,不需要特殊处理

(x,y|1≤x<M,1≤y<N)

同理,没超过int

2.能量计算规则

规定每个机器人只能向上下左右的相邻方格移动,每移动一个方格需要消耗1个单位能量。

只能上下左右相邻方格移动情况下的最短路径,就是小学数学的数格子
数一数纵向的距离,再数一数横向的距离
如图

  • 假设有两个点
  • A是目标位置
  • N是当前位置
  • 他们并不重合
  • 我们要计算两者之间的距离是多少

从N出发到与A齐平,一格一格往前数,是6步
从转折位置向左走,总共是10步
在这里插入图片描述

,每移动一个方格需要消耗1个单位能量。

也就是说,刚才从N到A一共走了10步,一步一个能量,就是10能量

一个方格可能有多个机器人

说明一些点会重合
假如N上有两个机器人
那么N到A的路程就会被走两次,我们在计算总共的距离时,需要将这个点的路程*2

以此类推
其他点以此类推
在这里插入图片描述
所有步的相加,就是所有机器人到目标的能量
这里不需要用列表

3.计算范围

集合点只能是某个机器人初始所在方格

这里限定范围,范围是所有机器人的初始位置

所有机器人到达该点消耗的总能量最低。

输出条件是总能量最低
也就是说,我们要遍历所有点到目标点的距离
因为最后我们不涉及排序,不涉及比较,
最后只保留计算后的值,在最后保留数值就OK

4.输入输出格式

第一行是一个整数K(0<K≤100),表示有机器人的方格数量

输入一个K,不涉及数值溢出
可以直接用K=int(input())

之后K行表示初始状态有机器人的方格位置(x,y|1≤x<M,1≤y<N)和方格内的机器人数量n,以空格隔开。

输入一行数据 第一个是机器人所在的横坐标,第二个机器人所在的是纵坐标,第三个是机器人数量
这里要用列表输入,列表命名为rb,robots机器人。
后续坐标需要单独提出来,放在新的列表里面,命名为rbP,robots point

总结
  1. 取值范围
  • 都在int的范围内
  • 对于遍历没有影响
  1. 计算方式

    1. 获得坐标,机器人数
    2. 设计切换目标点的代码
    3. 计算每个点到目标位置的x坐标和y坐标,然后加和
    4. 如果一个点上有两个机器人,要把路径乘两遍,有3个就乘3遍
    5. 判断只不是最小距离,并选择要不要储存
    6. 输出最小值
    7. 计算涉及(x,y,n)三个数值,代表横坐标,纵坐标,和机器人数
  2. 输入与输出

    1. 系统输入一个K
    2. 系统输入一行(x,y,n)代表横坐标,纵坐标,和机器人数,使用列表,列表命名为rbP,也就是robot positions机器人位置的简写

代码实现

从计算条件开始,最后处理输入条件
代码全貌

def get_min(rbP):
    # 初始化能量最小值,使用 float('inf') 作为初始最大值
    minE = float('inf')

    # 初始化最佳目标点,设置为 None,因为稍后将存储一个坐标元组
    bestP = None

    # 遍历每一个可能的集合点
    for p in rbP:
        # 提取当前候选集合点的坐标 (aimX, aimY)
        aimX, aimY, _ = p

        # 初始化总能量为 0
        totalE = 0

        # 遍历所有机器人位置,计算到当前目标点的距离,并加权累加到 totalE 中
        for (x, y, n) in rbP:
            totalE += (abs(x - aimX) + abs(y - aimY)) * n

        # 如果当前计算出的总能量小于之前的最小能量,则更新最小能量和最佳目标点
        if totalE < minE:
            minE = totalE
            bestP = (aimX, aimY)

    # 返回最低能量消耗和最佳目标点的位置
    return minE, bestP

# 从用户输入获取 K 的值,即要处理多少个机器人位置数据
K = int(input())

# 初始化空列表用于存储所有机器人位置数据
rbP = []

# 循环读取 K 行输入,每行包括 x, y 和 n,然后添加到 rbP 列表中
for _ in range(K):
    x, y, n = map(int, input().split())
    rbP.append((x, y, n))

# 调用函数并输出结果
resE, bestP = get_min(rbP)
print(resE, bestP)
1. 函数的详细解释

定义函数

#	定义函数get_min以获得最小值,将读入的数据列表rbP 放进计算方式里
def get_min(rbP):

初始化值

# 初始化能量最小值,energy min 所以命名minE
# float('inf')是python内置的最大值,float('inf')就是最小值,写None也可以但是后续要加条件,推荐用 float('inf')
	minE=float('inf')
#	初始化最佳目标点,也就是最佳路径点  best position 也就是bestP,这里只能写None,因为这里之后是存列表的,不是存值的
	bestP=None
遍历每一个目标点
	for p in rbP:	
#	把xy拿出来,命名为目标xy aimX,aimY,然后给机器人数量一个变量防止报错
#python可以多个变量同时命名

进行初始化

	aimX,aimY,_=p
#	初始化计算所有点到当前目标点的距离,命名totalE,也就是toatal energy总共的能量
	totalE =0

算所有的点到目标点的距离,并把重复的路径多乘,最后得到totalE

	for(x,y,n) in rbP:

写计算流程

#		abs 求绝对值
#		x, y分开计算,因为不能让机器人走斜线
#		abs 是绝对差,就是当前x到目标x的距离
		totalE+=sum(abs(x-aimX)+abs(y-aimY))*n
		if totalE <minE :
		minE=totalE
		bestP=(aimX,aimY)		

算出totalE之后判断和minE的相比,totalE是多还是少,如果少就赋值给minE,minE的赋值是无限大,所以不需要考虑初始要不要多加条件去处理

然后储存当前目标点,要以元组的形式储存,因为看起来更好看
并且题目没有给输出格式,所以我们默认用最好看的模式输出

之后跳出循环,并返回以上操作后的最低点和最低能量

	return minE bestP
1. 输入的详细解释

单纯K输入

# 从用户输入获取 K 的值,即要处理多少个机器人位置数据
K = int(input())

初始化数值,做空列表

# 初始化空列表用于存储所有机器人位置数据
rbP = []

空列表不能直接读输入的数据
因为会变成读了一行字符串,后期还要拆分,然后再次操作变成整数

# 循环读取 K 行输入,每行包括 x, y 和 n,然后添加到 rbP 列表中
for _ in range(K):
    x, y, n = map(int, input().split())
    rbP.append((x, y, n))

最后初始化结果·,并输出
这会输出两个值

# 调用函数并输出结果
resE, bestP = get_min(rbP)
print(resE, bestP)

print(get_min(rbP))会直接输出一个元组

《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微垃圾桶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值