P1183 多边形的面积 - 洛谷https://www.luogu.com.cn/problem/P1183
题目描述 Description
给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。
多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。
输入描述 Input Description
输入文件第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200≤x,y≤200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
输出描述 Output Description
输出文件仅有一行包含一个整数,表示多边形的面积。
样例输入 Sample Input
10
2 3
2 2
1 2
1 3
0 3
0 0
4 0
4 1
3 1
3 3
样例输出 Sample Output
9
解题思路:
代码:
class Solution:
def __init__(self) -> None:
pass
def solution(self,n,vector):
result = 0
# ---Coding!
div = {} # 使用字典归类和保存简化后的“横”
# 因为此算法是只保留横,所以第一笔竖起时,要做此处理
if vector[0][1] != vector[1][1]:
k = vector[0]
for i in range(n-1):
vector[i] = vector[i+1]
vector[n-1] = k
for i in range(n-1):
# 是否水平移动
if vector[i][1] == vector[i+1][1]:
# 记录“横”所在的Y轴坐标
y = vector[i][1]
# 向右移动
if vector[i+1][0] > vector[i][0]:
# 把“横”按长度为1切割,并以X轴坐标为分类保存在字典
for x in range(vector[i][0],vector[i+1][0]):
if x not in div.keys():
div[x] = []
div[x].append(y)
# 向左移动
elif vector[i+1][0] < vector[i][0]:
for x in range(vector[i+1][0],vector[i][0]):
if x not in div.keys():
div[x] = []
div[x].append(y)
else:
pass
for i in div.keys():
# 排序,方便计算同一X坐标的“横”在Y方向上的距离
div[i].sort()
# 各个小块相加,得到总面积
for j in range(0,len(div[i]),2):
result += div[i][j+1] - div[i][j]
print(div)
# ---
return result
if __name__ == "__main__":
n = int(input().strip())
vector = []
for i in range(n):
vector.append([int(item) for item in input().strip().split()])
s = Solution()
result = s.solution(n,vector)
print(result)
执行结果:
满分通过,不过内存和用时消耗有点大。用其它算法应该还有很大的提升空间。