#351
Medium Algorithms Android unlock patterns
Dynamic Programming Backtracking Bit Manipulation Bitmask
53.8% acceptance
Mar 31, 2026
211
240
No description available.
Solution
Rust
Time O(n)
Space O(n)
impl Solution {
pub fn number_of_patterns(m: i32, n: i32) -> i32 {
let mut skip = [[0u8; 10]; 10];
skip[1][3] = 2; skip[3][1] = 2;
skip[1][7] = 4; skip[7][1] = 4;
skip[3][9] = 6; skip[9][3] = 6;
skip[7][9] = 8; skip[9][7] = 8;
skip[1][9] = 5; skip[9][1] = 5;
skip[3][7] = 5; skip[7][3] = 5;
skip[2][8] = 5; skip[8][2] = 5;
skip[4][6] = 5; skip[6][4] = 5;
let mut visited = [false; 10];
let mut total = 0i32;
fn dfs(cur: u8, remaining: i32, visited: &mut [bool; 10], skip: &[[u8; 10]; 10]) -> i32 {
if remaining == 0 {
return 1;
}
visited[cur as usize] = true;
let mut count = 0;
for next in 1u8..=9 {
let s = skip[cur as usize][next as usize];
if !visited[next as usize] && (s == 0 || visited[s as usize]) {
count += dfs(next, remaining - 1, visited, skip);
}
}
visited[cur as usize] = false;
count
}
for len in m..=n {
total += dfs(1, len - 1, &mut visited, &skip) * 4;
total += dfs(2, len - 1, &mut visited, &skip) * 4;
total += dfs(5, len - 1, &mut visited, &skip);
}
total
}
}