某天開會特別無聊,玩手機看到了這道題,好像是有道的筆試題。
ps:當時我想清楚+寫**也就不到半小時,但是寫成部落格花了大概3個小時,表述能力堪憂啊!
在滿足下列條件的情況下,手機解鎖九宮格總共有多少種解法
條件一,解鎖圖案最少經過兩個點
條件二,經過的點不能重複
拿到這個問題,首先想到兩點:
就拿左上1號點開始分析吧,每個點演算法應該是一樣的。
把九宮格想成乙個圖,解鎖的過程有點類似於對圖的深度優先搜尋。更精確的說,從乙個點起始的解鎖方式,一定是某個以這個點為根的深度優先生成樹上的一根樹枝。
說的可能不清楚,看圖!
下面是九宮格的乙個深度優先遍歷,箭頭上的數字代表遍歷順序。
深度優先生成樹如下,那麼1→5是一種解鎖方式,1→2也是,還有1→5→9→6和1→5→9→6→3→4→7→8等等
再想想,怎麼進行深度優先搜尋呢?也就是說乙個點如何能滑動到下乙個點?
由於連續向同乙個方向滑動兩個點可以理解為滑動了兩次,所以從乙個點滑到下乙個點只有上下左右、斜向、日字這幾種滑動方式:
手機螢幕就那麼大點,不是每乙個點都支援上面所有的滑動方式。基本原則有兩個:
1. 滑動後不能超出9個點的範圍
2. 不能滑到已經經過的點。
最後別忘了,一次深度優先搜尋,只能產生不多的幾個解鎖方式。為了求出所有解,我們還要結合廣度優先搜尋,即在深度優先搜尋路徑的每個點上,嘗試所有可能的滑動方向。
好了演算法的思路基本有了~
圖的表示
剛才說了,九宮格是乙個圖,那就用乙個二維陣列來描述吧。陣列的值表示該節點是否已被滑過。
int used[3][3];
其中: us
ed[i
][j]
=, //left
, //right
, //up
, //down
... };c**實現參見我的git庫中的slideunlock
手機解鎖問題
記錄手機鎖屏題的思路 昨天 了 閱兵式上,國王見到了很多新奇東西,包括一台安卓手機。他很快對手機的圖形解鎖產生了興趣。解鎖介面是乙個 3 33 times 33 3 的正方形點陣,第一行的三個點標號 1,2,31,2,31,2,3,第二行的三個點標號 4,5,64,5,64,5,6,第三行的三個點標...
手機螢幕解鎖
實現原理 利用html5的canvas,將解鎖的圈圈劃出,利用touch事件解鎖這些圈圈,直接看 function createcircle restpoint.push return arr 複製 canvas裡的圓圈畫好之後可以進行事件繫結 function bindevent false ca...
svn解鎖問題
今天遇到個很奇怪的問題,svn裡面的檔案明明沒有加鎖 檔案也沒有加鎖的圖示 可是在提交的時候,會提示 path is not locked svn no lock on path xx status 423 on put request ra layer request failed svn ser...