Java Leetcode 351 Android解锁模式

Java Leetcode 351 Android解锁模式,java,algorithm,backtracking,Java,Algorithm,Backtracking,我正试图从Leetcode解决这个问题。但是我在大约5个小时的调试后找不到这个bug。以下是问题描述: 给定一个安卓3x3钥匙锁屏幕和两个整数m和n,其中1≤ M≤ N≤ 9、统计该系统的解锁模式总数 安卓锁屏,由最少m个键和最多n个键组成 钥匙 有效模式的规则: 每个图案必须至少连接m 键,最多n个键 所有的钥匙都必须是不同的 如果这条线 在模式中连接两个连续的关键点将通过任何 其他关键点,其他关键点必须以前在 图案不允许跳过未选定的关键点 使用钥匙的顺序很重要 说明: | 1 | 2 | 3

我正试图从Leetcode解决这个问题。但是我在大约5个小时的调试后找不到这个bug。以下是问题描述:

给定一个安卓3x3钥匙锁屏幕和两个整数m和n,其中1≤ M≤ N≤ 9、统计该系统的解锁模式总数 安卓锁屏,由最少m个键和最多n个键组成 钥匙

有效模式的规则:

  • 每个图案必须至少连接m 键,最多n个键
  • 所有的钥匙都必须是不同的
  • 如果这条线 在模式中连接两个连续的关键点将通过任何 其他关键点,其他关键点必须以前在 图案不允许跳过未选定的关键点
  • 使用钥匙的顺序很重要
  • 说明:

    | 1 | 2 | 3 |
    | 4 | 5 | 6 | 
    | 7 | 8 | 9 | 
    
    无效移动:
    4-1-3-6
    第1-3行通过未在中选择的键2 模式

    无效移动:
    4-1-9-2
    第1-9行通过键5,该键具有 未在模式中选择

    有效移动:
    2-4-1-3-6
    第1-3行有效,因为它通过了 通过模式中选择的键2

    有效移动:
    6-5-4-1-9-2
    第1-9行有效,因为它 通过模式中选择的键5

    我使用回溯来解决这个问题,所以我不能使用太复杂的测试用例进行调试。我的代码在
    n=m=1
    n=m=2
    时可以通过,但在
    n=m=3
    时失败。我的代码将输出304而不是320

    我知道锁模式是对称的,也就是说,角点和边中间的点有相同的输出,所以如果我们找到一个,我们可以乘以四。最后,处理中心点。对于
    m=n=3
    ,我甚至试着画出每一个可能的组合,我得到角点有31个,中间点有35个,中心点有40个,所以总组合将是
    31*4+35*4+40=304
    。我检查和重画了好几次,仍然找不到丢失的16个

    我还查看了这个问题讨论部分的帖子。我觉得这些方法非常相似,但我不知道为什么我的方法会失败

    这是我的密码

    类解决方案{
    //每个小点都可以走。
    // 1 2 3
    // 4 5 6
    // 7 8 9
    int[][]方向=新int[][]{
    {0},
    {2, 4, 5, 6, 8},
    {1, 3, 4, 5, 6, 7, 9},
    {2, 4, 5, 6, 8},
    {1, 2, 3, 5, 7, 8, 9},
    {1, 2, 3, 4, 6, 7, 8, 9},
    {1, 2, 3, 5, 7, 8, 9},
    {2, 4, 5, 6, 8},
    {1, 3, 4, 5, 6, 7, 9},
    {2, 4, 5, 6, 8}
    };
    int m,n;
    公共整数模式(整数m,整数n){
    这个,m=m;
    这个,n=n;
    int res=0;
    布尔值[]已访问=新布尔值[10];
    res+=dfs(1,1,0,已访问)*4;
    res+=dfs(2,1,0,已访问)*4;
    res+=dfs(5,1,0,已访问);
    返回res;
    }
    公共整数dfs(整数cur、整数len、整数tempRes、布尔值[]){
    如果(len>n | | visted[cur])返回tempRes;
    如果(len>=m&&len
    有效移动:
    6-5-4-1-9-2
    行1-9是有效的,因为它通过模式中选择的键5

    您的代码没有考虑到这种可能性。这解释了为什么长度为3的模式比16稍少计数:从中间的
    5
    开始,以下模式是可能的:

    5->1->9
    5->2->8
    5->3->7
    等(共有8个图案从中心移动到每个相邻的正方形,然后从中心跳回来)

    从键
    4
    开始,有两个模式被跳过:
    4->1->7
    4->7->1
    。这是额外镜像3次(我们可以从任何边点开始,
    {2,4,6,8}
    )。8+8=16,说明所有丢失的模式


    如果你调整你的逻辑来处理这个问题,你应该回到正轨。

    我对方向有点困惑。对于键1,我们声称
    {2,4,5,6,8}
    是相邻的键。但是我们如何直接从键1跳到键6或键8?这些看起来像是非法跳转。哦,是的,我们可以从1-6、1-8、2-9等跳转。但是1-9和3-7将是非法的,因为它们将跨越5。这是安卓锁模式的一种规则……啊,好的,有意义。谢谢。如果你不介意用几个e更新帖子的话示例显示了给定两个相关输入的预期输出,这可能有助于进一步澄清问题(不过,不必说它们是编辑,这对未来的访问者来说可能有点混乱).你是否考虑过这样的情况:如果访问了5个,你可以让邻居从1跳到9?这可以解释为什么计数不足3,但2是可以的——这种跳过先前选择的关键点的情况在长度很小的情况下是不可能的。哇,这是一个很好的观点。你能举一个这个情况下有3个点的例子吗?