Android patterns possible on 3x3 matrix of numbers


https://www.quora.com/How-many-combinations-does-Android-9-point-unlock-have/answer/Yoyo-Zhou
Not only are nodes connected by adjacency and knight's moves; they can also connect via 2 steps along a line, or a peg jump, if the middle point is already used. That means the connectivity changes depending on what points have already been used.

So for example, if the nodes are labeled as

1 2 3

then (1 2 3), (2 1 3), (2 3 1), (3 2 1) could all be valid. (Note that these are all too short, since the minimum length is 4 points.)

The output of the code below is:

Sequences by length: [0, 0, 0, 0, 1624, 7152, 26016, 72912, 140704, 140704]
Total number of sequences: 
389112

min_seq_length = 4

def Middle(a, b):
  """Return the node between a and b if there is one, or None."""
  if (a+b)%2 != 0:
    return None
  mid = (a+b)/2
  if mid == 5:
    return mid
  if a%3 == b%3:
    return mid
  if (a-1)/3 == (b-1)/3:
    return mid
  return None

def NextValid(base):
  """Generate valid moves j+1 given a sequence of moves 1..j."""
  if len(base) >= 9:
    return
  if len(base) == 0:
    for i in xrange(1,10):
      yield i
    return
  for i in xrange(1,10):
    if not i in base:
      mid = Middle(i, base[-1])
      if mid is None or mid in base:
        yield i

def Sequences(base):
  """Generator for valid sequences of moves."""
  if len(base) >= min_seq_length:
    yield list(base)
  for n in NextValid(base):
    for s in Sequences(base + [n]):
      yield s

seqs_of_length = [0]*10

for seq in Sequences([]):
  seqs_of_length[len(seq)] += 1
print 'Sequences by length:', seqs_of_length
print 'Total number of sequences:', sum(seqs_of_length)
https://www.quora.com/How-many-combinations-does-Android-9-point-unlock-have
http://stackoverflow.com/questions/12127833/patterns-possible-on-3x3-matrix-of-numbers

http://www.guokr.com/article/49408/
Android 的密码是 3 × 3 点阵中的一条路径,这条路径可以交叉,可以“走日字”,几乎是无所不能(只要不经过重复点),但却有一个例外:路径不允许跳过途中必须要经过的点。例如, 如果从左上角的点连接到右上角的点,中间的那个点会被自动地加进路径里。但麻烦就麻烦在,这个规则本身也有一个值得注意的地方:如果中间的点是之前已经用过的,那么这个点就可以被跳过去了。
/gkimage/e8/kt/3e/e8kt3e.png
我们不妨把点阵中的九个点分别用数字 1 到 9 编号。按照上述规则,4136、4192 都是不合法的,但 24136、654192 则都是可行的
包含 4、5、6、7、8、9 个点的合法路径数分别为 1624、7152、26016、72912、140704、140704
http://www.1point3acres.com/bbs/thread-148564-1-1.html
计算可能的 Android 解锁图案的个数。
限制条件:
i) 3x3 共九个点-google 1point3acres
ii) 最短图案包含 4 个点
iii) 最长图案包含 9 个点
iv) 路径不得跨越未访问的点,但是可以跨越访问过的点
例如, 0-2-6-8 就不合法(0-2 跨越了 1, 2-6 跨越 4, 6-8跨越了7)
0-1-2-4-6-7-8 或者 7-4-1-0-2-6-8 是合法的

0 1 2
3 4 5
6 7 8
http://www.cnblogs.com/EdwardLiu/p/5141771.html
1 2 3
4 5 6
7 8 9
只有中间没有其他键的两个键才能相连,比如1可以连 2 4 5 6 8 但不能连 3 7 9
但是如果中间键被使用了,那就可以连,比如5已经被使用了,那1就可以连9
每个键只能用一次,给定一个长度L,求问有多少unique path with length L

Backtracking: 我的code不光可以知道数目,还可以打印所有Pattern
 4 public class Solution {
 5     int res = 0;
 6     HashSet<Integer> set = new HashSet<Integer>();
 7     static ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
 8     ArrayList<Integer> path = new ArrayList<Integer>();
 9     
10     public int calculate(int L) {
11         for (int i=1; i<=9; i++) {
12             set.add(i);
13         }
14         HashSet<Integer> visited = new HashSet<Integer>();
15         helper(0, 0, L, visited);
16         return res;
17     }
18     
19     public void helper(int cur, int pos, int L, HashSet<Integer> visited) {
20         if (pos == L) {
21             res++;
22             result.add(new ArrayList<Integer>(path));
23             return;
24         }
25         for (int elem : set) {
26             if (visited.contains(elem)) continue;
27             if (cur == 1) {
28                 if (elem==3 && !visited.contains(2)) continue;
29                 if (elem==7 && !visited.contains(4)) continue;
30                 if (elem==9 && !visited.contains(5)) continue;
31             }
32             else if (cur == 2) {
33                 if (elem==8 && !visited.contains(5)) continue;
34             }
35             else if (cur == 3) {
36                 if (elem==1 && !visited.contains(2)) continue;
37                 if (elem==7 && !visited.contains(5)) continue;
38                 if (elem==9 && !visited.contains(6)) continue;
39             }
40             else if (cur == 4) {
41                 if (elem == 6 && !visited.contains(5)) continue;
42             }
43             else if (cur == 6) {
44                 if (elem == 4 && !visited.contains(5)) continue;
45             }
46             else if (cur == 7) {
47                 if (elem==1 && !visited.contains(4)) continue;
48                 if (elem==3 && !visited.contains(5)) continue;
49                 if (elem==9 && !visited.contains(9)) continue;
50             }
51             else if (cur == 8) {
52                 if (elem==2 && !visited.contains(5)) continue;
53             }
54             else if (cur == 9) {
55                 if (elem==1 && !visited.contains(5)) continue;
56                 if (elem==3 && !visited.contains(6)) continue;
57                 if (elem==7 && !visited.contains(8)) continue;
58             }
59             visited.add(elem);
60             path.add(elem);
61             helper(elem, pos+1, L, visited);
62             visited.remove(elem);
63             path.remove(path.size()-1);
64         }
65     }
71     public static void main(String[] args) {
72         // TODO Auto-generated method stub
73         Solution sol = new Solution();
74         int res = sol.calculate(3);
75         System.out.println(res);
76         for (ArrayList<Integer> each : result) {
77             System.out.println(each);
78         }
79     }
81 }

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts