Leetcode——安卓系统手势解锁(九宫格)
生活随笔
收集整理的這篇文章主要介紹了
Leetcode——安卓系统手势解锁(九宫格)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 安卓系統手勢解鎖
(1)回溯(模版方法)
// 至少 需要經過 m 個點,但是 不超過 n 個點的。class Solution {int count = 0;public int numberOfPatterns(int m, int n) {if (m > n)return 0;//對于每個路徑長度進行回溯for (int i = m; i <= n; i++) {HashSet<Integer> inPath = new HashSet<>();Deque<Integer> path = new LinkedList<>();trackBacking(0, i, path, inPath);}/* 考慮對稱,對稱可以節省計算numberOfPatterns(0, m, n, visited, 1);numberOfPatterns(1, m, n, visited, 1);count *= 4;numberOfPatterns(4, m, n, visited, 1);*/return count;}/** @param cur 當前的點* @param len 路徑長度* @param path 路徑* @param inPath 路徑中已存在的點*/private void trackBacking(int cur, int len, Deque<Integer> path, HashSet<Integer> inPath) {if (path.size() == len) {count++;return;}for (int tar = 1; tar <= 9; tar++) {//目標點是當前點或者已經在路徑內if (tar == cur || inPath.contains(tar))continue;//計算兩個點之間有沒有存在的點,如果沒有,返回nullInteger pointBetween = getPointBetween(cur, tar);//當前點和目標點之間有點,并且不在已訪問的路徑內if (pointBetween != null && !inPath.contains(pointBetween))continue;path.addLast(tar);inPath.add(tar);trackBacking(tar, len, path, inPath);path.pollLast();inPath.remove(tar);}}//計算兩個點之間有沒有存在的點,如果沒有,返回nullpublic Integer getPointBetween(int startPoint, int targetPoint) {if (startPoint == -1)return null;int[] startP = getPosition(startPoint);int[] targetP = getPosition(targetPoint);int diff = Math.abs(startP[0] - targetP[0]) + Math.abs(startP[1] - targetP[1]);//兩點之間無其他點,之間相連if (diff == 1) return null;//兩點之間有一個點else if (diff == 2) {//同行相隔一個點:1,3 ; 4,6 ; 7,9 等if (startP[0] == targetP[0])return 3 * startP[0] + Math.min(startP[1], targetP[1]) + 2;//同列相隔一個點:1,7 ; 2,8 ; 3,9 等else if (startP[1] == targetP[1])return 3 * (Math.min(startP[0], targetP[0]) + 1) + startP[1] + 1;//其他情況都不存在else return null;}//兩點之間為4,只有中間節點為5時有效else if (diff == 4) {if (startP[0] + targetP[0] == 2 && startP[1] + targetP[1] == 2) {return 5;}}//其他情況比如:2,9相連時,相當于中間沒有節點return null;}//存儲 1 - 9 每個節點的位置public int[] getPosition(int point) {switch (point) {case 1:return new int[]{0, 0};case 2:return new int[]{0, 1};case 3:return new int[]{0, 2};case 4:return new int[]{1, 0};case 5:return new int[]{1, 1};case 6:return new int[]{1, 2};case 7:return new int[]{2, 0};case 8:return new int[]{2, 1};case 9:return new int[]{2, 2};default:return new int[]{-1, -1};}} }(2)回溯(簡潔寫法)
- 矩形的遍歷搜索
- 本題比較特殊,方向不再是上下左右,還有四個對角線,仔細觀察示例,發現還有與當前位置偏移(1,2)的也算
- 如果中間有已經訪問點,仍可以連接其后的點,實際上就是在當前方向遇到已訪問點,遍歷其后面的點是否未訪問,未訪問則選擇這個點
總結
以上是生活随笔為你收集整理的Leetcode——安卓系统手势解锁(九宫格)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单手机九宫格解锁
- 下一篇: java信息管理系统总结_java实现科