日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Leetcode——安卓系统手势解锁(九宫格)

發布時間:2024/3/26 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的也算
  • 如果中間有已經訪問點,仍可以連接其后的點,實際上就是在當前方向遇到已訪問點,遍歷其后面的點是否未訪問,未訪問則選擇這個點
class Solution {int count;// 上下及對角線、斜線,總共16個組合int[][] direction = {{1,0}, {-1,0}, {0,1}, {0,-1}, {1,1}, {-1,-1}, {1,-1}, {-1,1}, {1,2}, {2,1}, {1,-2},{-2,-1}, {-1,2}, {2,-1},{-1,-2}, {-2,1}};public int numberOfPatterns(int m, int n) {// 判斷是否訪問過boolean[] visited = new boolean[9];// 9個起點for (int i = 0; i < 9; i++) {numberOfPatterns(i, m, n, visited, 1);}return count;}private void numberOfPatterns(int start, int m, int n, boolean[] visited, int num) {//已經遍歷過,或者節點超過n個if (visited[start] || num > n) return;//符合條件的節點,count++if (num >= m && num <= n) count++;// 試探visited[start] = true;//例如2:在0行,1列 : 2/3 = 0, 2 % 3 = 1, 所以這里行用 / , 列用%int row = start / 3, col = start % 3;for (int[] dir : direction) {int x = row + dir[0], y = col + dir[1];// 新坐標非法if (x < 0 || x > 2 || y < 0 || y > 2) continue;// 如果新坐標被訪問過,根據題意,在該方向繼續查找,直到找到一個未訪問的有效點while (visited[x * 3 + y]) {x += dir[0];y += dir[1];// 新坐標非法if (x < 0 || x > 2 || y < 0 || y > 2) break;}// 新坐標非法if (x < 0 || x > 2 || y < 0 || y > 2) continue;numberOfPatterns(3 * x + y, m, n, visited, num + 1);}// 回溯visited[start] = false;} }

總結

以上是生活随笔為你收集整理的Leetcode——安卓系统手势解锁(九宫格)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。