標籤:
滑動解鎖是智能手機一項常用的功能。你需要在3x3的點陣上,從任意一個點開始,反覆移動到一個尚未經過的"相鄰"的點。這些划過的點所組成的有向折線,如果與預設的折線在圖案、方向上都一致,那麼手機將解鎖。兩個點相鄰若且唯若以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。
為了描述方便,我們給這9個點從上到下、從左至右依次編號1-9。那麼1->2->3是不合法的,因為長度不足。1->3->2->4也是合不法的,因為1->3穿過了尚未經過的點2。2->4->1->3->6是合法的,因為1->3時點2已經被划過了。
無意中看到了這道題 而且在知乎回答中 各種語言啊 於是我今天上午無聊時也想做做了 哈哈
我可是沒看別人的代碼 看了正確結果~ 因為感覺搜尋搜來搜去 好爽啊 就按照自己想的寫了
知乎這道題地址:https://www.zhihu.com/question/24905007
使用DFS(深搜即可) 遍曆所有可能的情況 然後篩選不可能的情況
首先使用一個數組 把不可能出現的情況列出
filter[1][3]=filter[3][1]=2;filter[4][6]=filter[6][4]=5;filter[7][9]=filter[9][7]=8;filter[1][7]=filter[7][1]=4;filter[2][8]=filter[8][2]=5;filter[3][9]=filter[9][3]=6;filter[1][9]=filter[9][1]=5;filter[3][7]=filter[7][3]=5;
然後深搜的同時也進行篩選
void dfs(int count){if(count>=4){result++;}for(int i=1;i<=9;i++){if(count>0&&!vis[filter[stamp[count-1]][i]])continue;if(!vis[i]){vis[i]=1;stamp[count]=i;dfs(count+1);vis[i]=0;}}return ;}
全部代碼:
#include <stdio.h>#include <string.h>int filter[10][10];int stamp[9];bool vis[10];int result;void dfs(int count){if(count>=4){result++;}for(int i=1;i<=9;i++){if(count>0&&!vis[filter[stamp[count-1]][i]])continue;if(!vis[i]){vis[i]=1;stamp[count]=i;dfs(count+1);vis[i]=0;}}return ;}int main(){memset(filter,0,sizeof(filter));filter[1][3]=filter[3][1]=2;filter[4][6]=filter[6][4]=5;filter[7][9]=filter[9][7]=8;filter[1][7]=filter[7][1]=4;filter[2][8]=filter[8][2]=5;filter[3][9]=filter[9][3]=6;filter[1][9]=filter[9][1]=5;filter[3][7]=filter[7][3]=5;result=0;vis[0]=true;dfs(0);printf("%d\n",result);}
結果:
手機的九宮格圖案解鎖總共能繪出多少種圖案?(hiho類比面試題2 - google線上技術筆試類比)