用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语言计算手机的九宫格图案解锁总共能绘出多少种图案相关推荐
- 手机的九宫格图案解锁总共能绘出多少种图案?(hiho模拟面试题2 - google在线技术笔试模拟)
滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...
- 手机的九宫格图案解锁总共能绘出多少种图案?LeetCode 351. Android Unlock Patterns
需要满足的要求有: 至少经过四个点: 不能重复经过同一个点: 路径上的中间点不能跳过(如从1到3一定会经过2): 如果中间的点是之前已经用过的,那么这个点就可以被跳过(如213,因为2已经被用过,1就 ...
- Appium九宫格滑动解锁研究
九宫格滑动解锁,目前发现有两种一种是每个可点的方格都是一个imageview,九宫格则对应有9个imageview,此类解锁已有前人研究解决了,可以参照tobecrazy的博客 今天我要说的是另一种, ...
- Flex【原创】模拟Android图案解锁
Flex 实现Android图案解锁功能 看见Andorid系统里面有图案解锁的功能,试想能用Flex的移动开发实现吗?答案是:完全可以! 环境:Flex 4.6(air3.2) 先看我的包结构: 第 ...
- java 计算九宫格_Java计算手机九宫格锁屏图案连接9个点的方案总数
(一)问题 九宫格图案解锁连接9个点共有多少种方案? (二)初步思考 可以把问题抽象为求满足一定条件的1-9的排列数(类似于"八皇后问题"),例如123456789和9876543 ...
- java实现九宫格解锁_Java计算手机九宫格锁屏图案连接9个点的方案总数
(一)问题 九宫格图案解锁连接9个点共有多少种方案? (二)初步思考 可以把问题抽象为求满足一定条件的1-9的排列数(类似于"八皇后问题"),例如123456789和9876543 ...
- 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学吧里看到的一个有趣问题,题目描述很简单: 求手机九宫格图案解锁一共有多少种答案.规则大家应该都知道,至少连四个点,最多连九个点,一条直线上的三个点只有 ...
- c语言打印五角星图案解锁教程,手机解锁图案五角星怎么?
2018-05-19 手机图案解锁忘了怎么办 一.关机法按手机电源键直接关闭手机,或者直接拔下电池,重新启动,因为锁屏是在屏幕不操作一段时间后才启动的,所以刚启动时是直接进入系统自带的解锁界面的或直接 ...
- 手机9宫格图案解锁方法总数计算
图案解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...
最新文章
- 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图
- mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL
- gridstack 宽度改变_Model Y在Model 3有哪些改变?
- 产品经理一定要理解数据
- helm部署SkyWalking
- Android中Log信息的输出方法
- 阿里主管通知我试用期延期……
- 做外贸出口,要想快速开发客户,快速赚大钱
- JavaScript继承理解:ES5继承方式+ES6Class继承对比
- 【420天】跃迁之路——程序员高效学习方法论探索系列(实验阶段177-2018.04.01)...
- Java算法-冒泡排序
- TSSD2018下载地址及更新说明
- 1一10到时的英文单词_1到10的英语单词
- PDF文件怎么压缩大小
- 开启和关闭Windows远程管理(WinRM)
- CodeForces - 1427C
- java贪吃蛇代码idea_IntelliJ idea使用笔记 - 贪吃蛇学院-专业IT技术平台
- 微信小程序常用组件库收藏备用
- Android ContentProvider初探
- 描述统计 | 学习笔记 (全)