Leetcode——安卓系统手势解锁(九宫格)
生活随笔
收集整理的這篇文章主要介紹了
Leetcode——安卓系统手势解锁(九宫格)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 安卓系統(tǒng)手勢(shì)解鎖
(1)回溯(模版方法)
// 至少 需要經(jīng)過(guò) m 個(gè)點(diǎn),但是 不超過(guò) n 個(gè)點(diǎn)的。class Solution {int count = 0;public int numberOfPatterns(int m, int n) {if (m > n)return 0;//對(duì)于每個(gè)路徑長(zhǎng)度進(jìn)行回溯for (int i = m; i <= n; i++) {HashSet<Integer> inPath = new HashSet<>();Deque<Integer> path = new LinkedList<>();trackBacking(0, i, path, inPath);}/* 考慮對(duì)稱(chēng),對(duì)稱(chēng)可以節(jié)省計(jì)算numberOfPatterns(0, m, n, visited, 1);numberOfPatterns(1, m, n, visited, 1);count *= 4;numberOfPatterns(4, m, n, visited, 1);*/return count;}/** @param cur 當(dāng)前的點(diǎn)* @param len 路徑長(zhǎng)度* @param path 路徑* @param inPath 路徑中已存在的點(diǎn)*/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++) {//目標(biāo)點(diǎn)是當(dāng)前點(diǎn)或者已經(jīng)在路徑內(nèi)if (tar == cur || inPath.contains(tar))continue;//計(jì)算兩個(gè)點(diǎn)之間有沒(méi)有存在的點(diǎn),如果沒(méi)有,返回nullInteger pointBetween = getPointBetween(cur, tar);//當(dāng)前點(diǎn)和目標(biāo)點(diǎn)之間有點(diǎn),并且不在已訪(fǎng)問(wèn)的路徑內(nèi)if (pointBetween != null && !inPath.contains(pointBetween))continue;path.addLast(tar);inPath.add(tar);trackBacking(tar, len, path, inPath);path.pollLast();inPath.remove(tar);}}//計(jì)算兩個(gè)點(diǎn)之間有沒(méi)有存在的點(diǎn),如果沒(méi)有,返回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]);//兩點(diǎn)之間無(wú)其他點(diǎn),之間相連if (diff == 1) return null;//兩點(diǎn)之間有一個(gè)點(diǎn)else if (diff == 2) {//同行相隔一個(gè)點(diǎn):1,3 ; 4,6 ; 7,9 等if (startP[0] == targetP[0])return 3 * startP[0] + Math.min(startP[1], targetP[1]) + 2;//同列相隔一個(gè)點(diǎn):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;}//兩點(diǎn)之間為4,只有中間節(jié)點(diǎn)為5時(shí)有效else if (diff == 4) {if (startP[0] + targetP[0] == 2 && startP[1] + targetP[1] == 2) {return 5;}}//其他情況比如:2,9相連時(shí),相當(dāng)于中間沒(méi)有節(jié)點(diǎn)return null;}//存儲(chǔ) 1 - 9 每個(gè)節(jié)點(diǎn)的位置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)回溯(簡(jiǎn)潔寫(xiě)法)
- 矩形的遍歷搜索
- 本題比較特殊,方向不再是上下左右,還有四個(gè)對(duì)角線(xiàn),仔細(xì)觀察示例,發(fā)現(xiàn)還有與當(dāng)前位置偏移(1,2)的也算
- 如果中間有已經(jīng)訪(fǎng)問(wèn)點(diǎn),仍可以連接其后的點(diǎn),實(shí)際上就是在當(dāng)前方向遇到已訪(fǎng)問(wèn)點(diǎn),遍歷其后面的點(diǎn)是否未訪(fǎng)問(wèn),未訪(fǎng)問(wèn)則選擇這個(gè)點(diǎn)
總結(jié)
以上是生活随笔為你收集整理的Leetcode——安卓系统手势解锁(九宫格)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简单手机九宫格解锁
- 下一篇: 远程桌面监控系统java_基于Java的