用C语言计算手机的九宫格图案解锁总共能绘出多少种图案
生活随笔
收集整理的這篇文章主要介紹了
用C语言计算手机的九宫格图案解锁总共能绘出多少种图案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前在學校的一個社團招募大一新生時,給出了這個題目:
用程序編寫完成九宮格圖案解鎖總共能繪出多少種圖案
需要滿足的要求有:
1.至少經過四個點;2.不能重復經過同一個點;
3.路徑上的中間點不能跳過(如從1到3一定會經過2);
4.如果中間的點是之前已經用過的,那么這個點就可以被跳過(如213,因為2已經被用過,1就可以越過2與3連接,132是不允許的)。
當時就在想,出這道題的社團負責人腦子是不是瓦特掉了,給大一的小孩子們剛開始就下這么猛的料。
問題跟我們的生活息息相關,畢竟現在大家都用的智能手機。看到題目后立馬想到了用遞歸算法來完成此問題。后來,抽空閑時間用C語言編寫出了此程序。
代碼見如下圖所示:
#include <stdio.h> #define M 3 int zhen[5][5];int count=0; void init(int a[5][5]) //初始化數組 {int i,j,num=1;for(i=0;i<M;i++)for(j=0;j<M;j++){a[i][j]=0;} }int decide(int a[5][5],int m,int n,int x,int y) //判斷當前手勢順序是否是一個合法手勢 {int max,min;int flag1=m-x;int flag2=(n-y)*(-1);if(m==-1&&n==-1)return 1;if((m==x)&&(n!=y)){if(n>y){max=n;min=y;}else{max=y;min=n;}for(min+=1;min<max;min++){if(a[m][min]==0)return 0;}return 1;}if((m!=x)&&(n==y)){if(m>x){max=m;min=x;}else{max=x;min=m;}for(min+=1;min<max;min++){if(a[min][n]==0)return 0;}return 1;}if(m==n&&x==y){if(m>x){max=m;min=x;}else{max=x;min=m;}for(min+=1;min<max;min++){if(a[min][min]==0)return 0;}return 1;}if(flag1==flag2){if(m>x){for(m-=1,n+=1;(m>x)&&(n<y);m--,n++)if(a[m][n]==0)return 0;}else{for(m+=1,n-=1;(m<x)&(n>y);m++,n--)if(a[m][n]==0)return 0;}return 1;}return 1; } void deal(int a[5][5],int level,int m,int n) {int i,j;int flag;if((m<M)&&(n<M)){for(i=0;i<M;i++){for(j=0;j<M;j++){if(a[i][j]!=1){flag=decide(a,m,n,i,j);if(flag!=0){a[i][j]=1;level+=1;if(level>=4){count++;}deal(a,level,i,j);a[i][j]=0;level--;}}}}} }int main() {int i,j;init(zhen);deal(zhen,0,-1,-1);printf("%d\n",count);return 0; }第一個函數init為數組初始化函數;第二個函數decide判斷當前手勢順序是否符合要求;第三個函數deal為遞歸函數。程序結構并不復雜,不做過多的論述。
程序中宏M的取值為3,代表當前計算的是三宮格。宏M的取值可以改為不同的值,代表計算不的格數。但同時程序運行的時間開銷會大大增加。筆者在完成此程序時,并沒有太考慮程序的時間開銷方面的問題。
程序算法采用了遞歸算法,思想上使用了窮舉的思想。
最后運行結果為:389112。哈哈,證明我們采用九宮格手勢做手機開機解鎖在理論上還是蠻安全的。
程序源碼下載地址:https://github.com/XiaoYaoNet/ThreeTable
總結
以上是生活随笔為你收集整理的用C语言计算手机的九宫格图案解锁总共能绘出多少种图案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连作业都不会抄!盘点那些年被淘宝直播带沟
- 下一篇: 戒指的带法,终于收齐了