手機的九宮格圖案解鎖總共能繪出多少種圖案? | 知乎問答精選

 

A-A+

手機的九宮格圖案解鎖總共能繪出多少種圖案?

2018年12月27日 知乎問答精選 暫無評論 閱讀 18 ℃ 次

【知乎用戶的回答(352票)】:

from itertools import *impossible = {'13': '2', '46': '5', '79': '8', '17': '4', '28': '5', '39': '6', '19': '5', '37': '5', '31': '2', '64': '5', '97': '8', '71': '4', '82': '5', '93': '6', '91': '5', '73': '5'}def counts(): iterlst = chain(*(permutations('123456789', i) for i in range(4, 10))) count = 0 for i in iterlst: stri = ''.join(i) for k, v in impossible.items(): if k in stri and v not in stri[:stri.find(k)]: break else: count += 1 return countprint(counts())

我用python寫了段代碼,先計算出所有大於四個數字的所有排列組合,然後從中剃除穿過中間那個數字的組合,剩下的既為符合要求的代碼。

例如13組合是不可能存在的,因為它會穿過2,19組合也不可能存在,因為它會穿過5,總共有16個這樣的組合。

但是假如中間這個數字已經用過了,是可以穿過的,比如213,2已經用過了,1是可以穿過2與3連接的。

如此篩選以後,就得到正確答案389112了。

【知乎用戶的回答(16票)】:

以下引用自果殼網:智能手機的密碼總共有多少種

Android 的密碼是 3 × 3 點陣中的一條路徑,這條路徑可以交叉,可以「走日字」,幾乎是無所不能(只要不經過重複點),但卻有一個例外:路徑不允許跳過途中必須要經過的點。例如, 如果從左上角的點連接到右上角的點,中間的那個點會被自動地加進路徑裡。但麻煩就麻煩在,這個規則本身也有一個值得注意的地方:如果中間的點是之前已經用過的,那麼這個點就可以被跳過去了。

我們不妨把點陣中的九個點分別用數字 1 到 9 編號。按照上述規則,4136、4192 都是不合法的,但 24136、654192 則都是可行的。死理性派這下苦惱了,似乎五花八門的組合數學模型在這裡都派不上用場。怎麼辦呢?別急,我們還有強大的計算機幫忙。下面,有請編輯最愛的數學軟件 Mathematica 登場。

首先,讓我們生成所有 985 824 種沒有限制的排列組合:

再記下不能直接連接的點對:

由此生成不合法的排列規則:

從全部排列組合中刪掉不合法的,便得到了所有可能的 Android 密碼了:

Android 密碼一共有多少種可能性呢?讓我們來看看:

這樣,我們就得到了一個準確的數字:在 Android 系統上一共有 389 112 種可能的密碼,只佔之前估計的密碼數上限的 1/3 左右。

【知乎用戶的回答(7票)】:

389112

C++的程序計算的。以前在哪個地方看到的,借過來用一下,求碼農檢驗。

#include

using namespace std;

long c=0,p=0;

int a[9];

void s(int k)

{

if(a[k]==0)

{

a[k]=1;

p++;

if(p>3)c++;

if(k==0){s(1);if(a[1]==1)s(2);s(3);s(4);s(5);if(a[3]==1)s(6);s(7);if(a[4]==1)s(8);}

if(k==1){s(0);s(2);s(3);s(4);s(5);s(6);if(a[4]==1)s(7);s(8);}

if(k==2){if(a[1]==1)s(0);s(1);s(3);s(4);s(5);if(a[4]==1)s(6);s(7);if(a[5]==1)s(8);}

if(k==3){s(0);s(1);s(2);s(4);if(a[4]==1)s(5);s(6);s(7);s(8);}

if(k==4){s(0);s(1);s(2);s(3);s(5);s(6);s(7);s(8);}

if(k==5){s(0);s(1);s(2);if(a[4]==1)s(3);s(4);s(6);s(7);s(8);}

if(k==6){if(a[3]==1)s(0);s(1);if(a[4]==1)s(2);s(3);s(4);s(5);s(7);if(a[7]==1)s(8);}

if(k==7){s(0);if(a[4]==1)s(1);s(2);s(3);s(4);s(5);s(6);s(8);}

if(k==8){if(a[4]==1)s(0);s(1);if(a[5]==1)s(2);s(3);s(4);s(5);if(a[7]==1)s(6); s(7);}

a[k]=0;

p--;

}

}

int main()

{

int i;

for(i=0;ifor(i=0;icout

return 0;

}

【三井壽阿三的回答(2票)】:

我是來看大家算出來的答案一不一樣的…

【知乎用戶的回答(0票)】:

樓主的規則是方便noob用戶使用的,實際的密碼設計編程毫無限制(相同數字連續也是可以的),根據密碼長度有9^N次方種情形,但最後都是經過加密算法存在某個文件裡的,如md5加密成16位或者32位,linux系統下有個目錄裡的某個文件就是存所有用戶名密碼的。其實手機如果丟了,數據安全就別想了,人家隨便加個777想看什麼看什麼,那些所謂的遠程鎖機都是些商業噱頭

【楊明的回答(0票)】:

第一位有9種選擇,第二位有8種選擇,第三位有7種選擇,……第一位有9種選擇,第二位有8種選擇,第三位有7種選擇,……

所以:密碼總數=9*8*7*6*5*4*3*2*1=362,880

感謝 @linkwun提醒,我的計算方法只考慮了密碼為9位的情形,漏了密碼少於9位的情形,特此更正。

標籤:-數學 -手機


相關資源:





給我留言