之前在学校的一个社团招募大一新生时,给出了这个题目:

用程序编写完成九宫格图案解锁总共能绘出多少种图案

需要满足的要求有:

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语言计算手机的九宫格图案解锁总共能绘出多少种图案相关推荐

  1. 手机的九宫格图案解锁总共能绘出多少种图案?(hiho模拟面试题2 - google在线技术笔试模拟)

    滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...

  2. 手机的九宫格图案解锁总共能绘出多少种图案?LeetCode 351. Android Unlock Patterns

    需要满足的要求有: 至少经过四个点: 不能重复经过同一个点: 路径上的中间点不能跳过(如从1到3一定会经过2): 如果中间的点是之前已经用过的,那么这个点就可以被跳过(如213,因为2已经被用过,1就 ...

  3. Appium九宫格滑动解锁研究

    九宫格滑动解锁,目前发现有两种一种是每个可点的方格都是一个imageview,九宫格则对应有9个imageview,此类解锁已有前人研究解决了,可以参照tobecrazy的博客 今天我要说的是另一种, ...

  4. Flex【原创】模拟Android图案解锁

    Flex 实现Android图案解锁功能 看见Andorid系统里面有图案解锁的功能,试想能用Flex的移动开发实现吗?答案是:完全可以! 环境:Flex 4.6(air3.2) 先看我的包结构: 第 ...

  5. java 计算九宫格_Java计算手机九宫格锁屏图案连接9个点的方案总数

    (一)问题 九宫格图案解锁连接9个点共有多少种方案? (二)初步思考 可以把问题抽象为求满足一定条件的1-9的排列数(类似于"八皇后问题"),例如123456789和9876543 ...

  6. java实现九宫格解锁_Java计算手机九宫格锁屏图案连接9个点的方案总数

    (一)问题 九宫格图案解锁连接9个点共有多少种方案? (二)初步思考 可以把问题抽象为求满足一定条件的1-9的排列数(类似于"八皇后问题"),例如123456789和9876543 ...

  7. 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学吧里看到的一个有趣问题,题目描述很简单: 求手机九宫格图案解锁一共有多少种答案.规则大家应该都知道,至少连四个点,最多连九个点,一条直线上的三个点只有 ...

  8. c语言打印五角星图案解锁教程,手机解锁图案五角星怎么?

    2018-05-19 手机图案解锁忘了怎么办 一.关机法按手机电源键直接关闭手机,或者直接拔下电池,重新启动,因为锁屏是在屏幕不操作一段时间后才启动的,所以刚启动时是直接进入系统自带的解锁界面的或直接 ...

  9. 手机9宫格图案解锁方法总数计算

    图案解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...

最新文章

  1. 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图
  2. mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL
  3. gridstack 宽度改变_Model Y在Model 3有哪些改变?
  4. 产品经理一定要理解数据
  5. helm部署SkyWalking
  6. Android中Log信息的输出方法
  7. 阿里主管通知我试用期延期……
  8. 做外贸出口,要想快速开发客户,快速赚大钱
  9. JavaScript继承理解:ES5继承方式+ES6Class继承对比
  10. 【420天】跃迁之路——程序员高效学习方法论探索系列(实验阶段177-2018.04.01)...
  11. Java算法-冒泡排序
  12. TSSD2018下载地址及更新说明
  13. 1一10到时的英文单词_1到10的英语单词
  14. PDF文件怎么压缩大小
  15. 开启和关闭Windows远程管理(WinRM)
  16. CodeForces - 1427C
  17. java贪吃蛇代码idea_IntelliJ idea使用笔记 - 贪吃蛇学院-专业IT技术平台
  18. 微信小程序常用组件库收藏备用
  19. Android ContentProvider初探
  20. 描述统计 | 学习笔记 (全)

热门文章

  1. 基于kali的一次无线渗透测试
  2. ofd怎么转换成图片 java_html如何转换为ofd?
  3. selenium定位不准的问题
  4. 【DP】AGC012 E Camel and Oases
  5. Kubernetes介绍
  6. ios Objective-c 获取省市区工具
  7. PyCharm external tools
  8. 陈阳,她离开微软,投身开源10年!只管热爱,无问西东
  9. angular8.5集成TinyMce5的使用和详细配置
  10. UCK制作Ubuntu livecd