leetcode351 安卓系统手势解锁

 注意:9 ——> 2没有经过任何点

            要求2的意思是:手势里不能有重复的点

class Solution:
    def numberOfPatterns(self, m: int, n: int) -> int:
        self.res = 0
        all_set = set(range(1, 10))
        
        # cur_set:当前走过的所有点
        # prev:现在所在的点
        def backtrack(cur_set, prev):
            if len(cur_set) >= m:
                self.res += 1
                if len(cur_set) == n:
                    return
            # 由于手势里不能有重复的  所以在键盘里把已经走过的点排除出去
            # 剩下的作为新的目标点
            for num in all_set - cur_set:
                abs_t = abs(num - prev)
                # 水平方向  跨过一个数
                if abs_t == 2 and min(num, prev) in {1, 4, 7} and (num + prev) // 2 not in cur_set: continue
                # 右下方向  跨过一个数
                if abs_t == 4 and min(num, prev) == 3 and 5 not in cur_set: continue
                # 竖直方向  跨过一个数
                if abs_t == 6 and (num + prev) // 2 not in cur_set: continue
                # 左下方向  跨过一个数
                if abs_t == 8 and 5 not in cur_set: continue
                backtrack(cur_set | {num}, num)
        # 以键盘上的任何一个点作为起始点
        for i in range(1, 10):
            backtrack({i}, i)

        return self.res

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值