第十一届蓝桥杯国赛 奇偶覆盖

      我的主要思路是找到每个矩形内的单位方格,再使用set集合将所有方格统计,最后在set集合里遍历每一个方格,统计其再矩形里出现的次数,即为面积。再蓝桥刷题系统上只能过30%,有优化方案的欢迎私信讨论。

#  矩形类
class The_it:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d


#  获取矩形内包含的面积为1的方格,用方格坐标表示:如矩形(1 1)(2 2)包含的方格坐标为(2 2)
#  注意区分坐标轴的坐标和方格坐标,定义方格坐标(1 1)为由(0,0)(1,1)的轴坐标构成,也就是第一象限的的一个方格
    def get_sq(self):
        set_sq = set()              #  这里用set和list都一样
        for x in range(a+1, c+1):
            for y in range(b+1, d+1):
                set_sq.add((x, y))
#  返回所有方格坐标
        return set_sq


#  初始化将每个矩形包含的方格保存在列表中
n = int(input())
all_big = []
for _ in range(n):
    a, b, c, d = map(int, input().split())
    once = The_it(a, b, c, d)
    all_big.append(once.get_sq())
#  获取所有方格,不重复,用set
all_sq = set()
for it in all_big:
    for sq in it:
        all_sq.add(sq)
#  奇偶判断,设置初始个数为0
s_j = 0
s_o = 0
#  从集合中获取方格
for sq in all_sq:
    cot = 0
    #  遍历每个矩形
    for it in all_big:
        if sq in it:
            cot += 1
        else:
            continue
    if cot % 2 == 1:
        s_j += 1
    else:
        s_o += 1
print(s_j)
print(s_o)

有更好的方法或优化方案的一定要来私信我呀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值