CCF认证模拟-201409-2-画图-python
题目
首先说一下在看到这道题以后我的思路:
抛开程序本身的问题
有两种思路:
一种思路是先计算全面积,之后减去重复部分
另一种是一个格子一个格子的数
错误代码示例(思路1)
首先放第二种思路的代码,这段是错误示例
a = int(input())
b = []
for i in range(a):
c = input().split()
b.append(c)
area = 0
for i in b:
area = area + abs(int(i[2])-int(i[0]))*abs(int(i[3])-int(i[1]))
lists = []
for x in range(len(b)):
for y in range(x, len(b)):
if x == y:
continue
if int(b[x][2])-int(b[y][0]) > 0 and int(b[x][3])-int(b[y][1]) > 0:
area = area - (int(b[x][2])-int(b[y][0]))*(int(b[x][3])-int(b[y][1]))
elif int(b[x][0])-int(b[y][2]) < 0 and int(b[x][1])-int(b[y][3]) < 0:
area = area - (int(b[x][0])-int(b[y][2]))*(int(b[x][1])-int(b[y][3]))
else:
continue
print(area)
错误的根源在于,只考虑到了两个图形重叠在一起时减去重叠部分,但是若三个图重叠,则会多减去一部分,虽然找到了错误根源,但是因为改起来比较复杂,后续思路还不够清晰,所以放弃了这种思路
正确代码示例(思路2)
因为指定测试规模为横纵坐标都在100以内,所以可以设置一个 100x100 的二维数组,将其中的元素全部置为0,之后将图形放入位置的元素置为1,重复的图像部分会重复置为1,不对结果产生影响,最后统计二维数组中值为1元素的个数
代码示例:
a = int(input())
b = []
for i in range(a):
c = input().split()
b.append(c)
space = []
for k in range(101):
sp = []
for l in range(101):
sp.append(0)
space.append(sp)
area = 0
for j in b:
for x in range(int(j[0]), int(j[2])):
for y in range(int(j[1]), int(j[3])):
space[x][y] = 1
for m in range(101):
for n in range(101):
if space[m][n] == 1:
area = area+1
print(area)
另一种思路
这种思路时老师提供的,更为简洁明了
思路是对坐标的统计,
利用坐标表示矩形的面积,红色方框的面积用坐标表示为取其左下角和右上角点,位于两者之间的点的坐标
之后每个方框的坐标也加入其中
使用python 的set()方法存放坐标:
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
最后set的长度即为面积
代码如下
n = int(input())
s = set()
for i in range(n):
c = list(map(int, input().split()))
for x in range(c[0], c[2]):
for y in range(c[1], c[3]):
s.add((x, y))
print(len(s))
后两种思路的测评结果全部为100,第一种思路存在问题结果为10
博主为初学者,不足的地方欢迎各位大佬留言指正