用C语言计算手机的九宫格图案解锁总共能绘出多少种图案
2018-03-08 10:30
513 查看
之前在学校的一个社团招募大一新生时,给出了这个题目:
用程序编写完成九宫格图案解锁总共能绘出多少种图案
需要满足的要求有:
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]
==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]
==0)
return 0;
}else
{
for(m+=1,n-=1;(m<x)&(n>y);m++,n--)
if(a[m]
==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
用程序编写完成九宫格图案解锁总共能绘出多少种图案
需要满足的要求有:
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]
==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]
==0)
return 0;
}else
{
for(m+=1,n-=1;(m<x)&(n>y);m++,n--)
if(a[m]
==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
相关文章推荐
- 手机的九宫格图案解锁总共能绘出多少种图案?(hiho模拟面试题2 - google在线技术笔试模拟)
- 智能手机总共有多少种解锁图案(c++版本)
- 九宫格手机解锁有多少种情况?
- 解锁图案-九宫格有多少种组合?安全吗?用程序来解答
- Java计算手机九宫格锁屏图案连接9个点的方案总数
- 用calc()绘制手机图案解锁的九宫格样式
- 解锁图案-九宫格有多少种组合?安全吗?用程序来解答
- 手机9宫格图案解锁方法总数计算
- 九宫格(安卓手机的图形锁有几种解锁图案)
- Unity制作九宫格手机手势解锁密码
- c语言:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
- Android之高仿手机QQ图案解锁
- Android之高仿手机QQ图案解锁
- asp.net 中计算某月总共有多少天 最后一日是几号。
- 2. 计算出1900年1月1日至当前日期之间总共间隔多少天,将其除以7取余数,该结果即为当月第一天是星期几,按日历格式输出
- 计算工程中总共有多少行代码
- 图案解锁——九宫格
- Android自定义九宫格图案解锁
- 现在手机解锁方式有多少种?例如密码、图形、声纹、面部识别。
- 亲测 小米5清除所有数据 包括指纹解锁和帐号图案解锁(此方法适用于所有Android手机)