CCF 20220612 寻宝!大冒险!

绝对不能用L,n最大是1000,S是50 而1000*50**2的复杂度是不会超时的,但在匹配的时候,因为绿化图只保存了1的位置,因此,匹配的时候只要相同位置的元素一致就行,若绿化图的位置为1,相同位置藏宝图就不能为0,同样地若绿化图的位置为0,相同位置藏宝图就不能为1。
具体步骤
1.因为匹配是从藏宝图左下角开始的,而且匹配时使用的坐标是藏宝图的i,j,而对应到绿化图上是x+i, y+j,因此,存储藏宝图时是从上到下,并且使用列表保存绿化图中每颗树的位置。并且若绿化图中某一坐标作为左下角能与藏宝图匹配,则其必须为1,因此我们可以采用遍历绿化图中每颗树能否作为藏宝图的左下角开始匹配。
2.匹配时需要注意两点:
(1)遍历绿化图每颗树(x, y)时,(x+i, y+j)均不能大于绿化图大小(L)
(2)匹配时,因为仅仅知道每颗树(1的位置)的坐标,0的位置可以曲线救国,保存所有1的坐标,若(x+i,y+j)不在这些坐标里面,其绿化图的位置就是0。

n, L, S = map(int, input().split())
A, d = [], {}
for i in range(n):
    x, y = map(int, input().split())
    A.append([x, y])
    d[(x, y)] = 0
B = []
for _ in range(S+1):
    B.insert(0, list(map(int, input().split())))
ans = 0
for x, y in A:
    flag = 0
    for i in range(S+1):
        for j in range(S+1):
            if (x+i > L) or (y+j > L):  # 超出绿化图大小
                flag = 1
                break
            if B[i][j]:   # 藏宝图该位置为1,则绿化图就不能为0
                if (x+i, y+j) not in d:
                    flag = 1
                    break
            else:      # 藏宝图该位置为0,则绿化图就不能为1
                if (x+i, y+j) in d:
                    flag = 1
                    break
        if flag == 1:  # 使用flag是因为break只能跳出一层循环
            break
    if flag == 0:
        ans += 1
print(ans)
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值