Java Leetcode 351 Android解锁模式
我正试图从Leetcode解决这个问题。但是我在大约5个小时的调试后找不到这个bug。以下是问题描述: 给定一个安卓3x3钥匙锁屏幕和两个整数m和n,其中1≤ M≤ N≤ 9、统计该系统的解锁模式总数 安卓锁屏,由最少m个键和最多n个键组成 钥匙 有效模式的规则: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
| 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个点的例子吗?