android 屏幕鎖有多少組合

我前幾天偶然想到一個組合數學/算法問題:安卓手機的屏幕鎖是3*3的9點矩陣,相鄰的點可以用一條直線連接,但每個點不可以重複連接。如果必須連接4個點(含4個點)以上纔算一個有效的形狀,一共有多少種形狀組合?

我在網上查到“果殼”去年有篇相關文章,《智能手機的密碼總共有多少種》用窮舉法“傻”算出了一個結果(不過其結果可能有錯,請對比後面我的源程序和計算結果)。我不欣賞缺乏思考的窮舉法,所以試着自己動手編程序計算,結果發現這個問題並不像看起來那麼難,程序的核心邏輯甚至不到10行代碼(Python)。先看一下我的計算結果。

相鄰的點細分有2類,以上圖1號點爲例:藍色箭頭所指的是直觀的、大部分人用的近點,紅色箭頭所指的是不直觀的、很少人用的遠點。我分別計算了只用近點(下圖藍色方塊)和用全部點(下圖紅色方塊)、從1點到9點的各種長度下,一共能有多少種形狀組合,彙總在下圖中。

從圖中可以看出來,只用近點的組合(我稱爲“懶惰”組合)遠遠少於用全部點的組合,如果再只用4個或5個點,這樣的密碼安全性並不高。爲了密碼安全,我推薦您使用8點全部組合方式。

再看一下我的程序結構,我用Python語言根據經典“圖”算法(單向、無權重)來計算這個3*3的9點矩陣:9個點從1到9編號(源程序第5行);每個點預設相應的鄰居點(源程序第8~18行);函數scan(源程序第44~52行)從任意一點起遞歸搜索所有可能的組合;函數log(源程序第37~41行)用文本樹格式記錄找到的組合;主程序(源程序第55~57行)針對9個不同的起點調用scan函數9次,最後打印計算結果。

我已經把這個小程序的Python源碼和計算出來的全部組合上傳到GitHub,請點這裏查看、下載或修改。

最後還有個小遺憾:我的這個小程序算法複雜度有點高 O(n!),不知道組合數學有沒有更好的辦法來分析這個問題。


發佈了32 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章