如何让Python程序适配Kattis凸多边形面积题的单行输入格式
解决Kattis《Convex Polygon Area》输入格式适配问题
我正在解决Kattis平台的《Convex Polygon Area》编程题,现有代码能计算正确结果,但无法适配Kattis的输入格式,导致无法通过评测。
现有代码如下:
class GetData: def coords() -> tuple[int, int]: x, y = map(int, input().split()) return x, y def polygons(n) -> list: data = [] ## Collect data for 'n' polygons for i in range(n): coord_list = [] ## number of points for the current polygon m = int(input()) ## Collect data for 'm' pairs of coordinates for the current polygon for j in range(m): x, y = GetData.coords() coord_list.append((x, y)) if j == (m-1): # all coordinate points have been defined area = Area.calculate(coord_list) data.append(area) return data
核心问题
当前代码只能处理每个坐标对单独一行的输入格式:
2 3 1 1 2 1 2 2 4 0 0 10 0 13 5 10 8
但Kattis要求的输入是每个多边形的所有顶点数据在同一行,样例输入如下:
2 3 1 1 2 1 2 2 4 0 0 10 0 13 5 10 8
按Kattis格式运行时会触发错误:
Traceback (most recent call last): File "/home/asaylor/Projects/OOP-ajsaylor/assignments/A2-OOD/convex-polygon-area.py", line 68, in <module> main() File "/home/asaylor/Projects/OOP-ajsaylor/assignments/A2-OOD/convex-polygon-area.py", line 61, in main data = GetData.polygons(n) File "/home/asaylor/Projects/OOP-ajsaylor/assignments/A2-OOD/convex-polygon-area.py", line 18, in polygons m = int(input()) ValueError: invalid literal for int() with base 10: '3 1 1 2 1 2 2'
我知道固定数量坐标对的单行处理方法,但本题中多边形顶点数是动态的,无法预先确定变量数量,所以需要调整代码逻辑。
解决方案
修改GetData.polygons方法,直接读取每行的所有数据,分割后提取顶点数和坐标对:
class GetData: def polygons(n) -> list: data = [] # 处理n个多边形 for _ in range(n): # 读取当前行的所有数据,转为整数列表 parts = list(map(int, input().split())) # 第一个元素是顶点数m m = parts[0] # 剩下的元素是坐标对,按每两个一组提取 coord_list = [] for i in range(1, len(parts), 2): x = parts[i] y = parts[i+1] coord_list.append((x, y)) # 计算面积并存储 area = Area.calculate(coord_list) data.append(area) return data
修改说明
- 读取整行数据:不再单独读取顶点数
m,而是直接读取当前多边形的整行输入,分割成整数列表。 - 动态提取坐标:列表第一个元素是顶点数
m,后续元素按每两个一组拆分,得到(x,y)坐标对,无需预先知道数量。 - 移除冗余的
coords方法:原方法是逐行读取坐标对,现在整行处理后可以直接提取坐标,该方法不再需要。
这样修改后,代码就能正确处理Kattis的单行多边形数据输入格式,同时保留原有的面积计算逻辑。
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

