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

博主为初学者,不足的地方欢迎各位大佬留言指正

posted @ 2020-07-03 10:28  博0_oer~  阅读(23)  评论(0编辑  收藏  举报