Skip to main content
Back to problems
#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)
LeetCode
solution.rs
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
  }
}