通常设置密码至少4个点,最多9个点,规则通常是两点之间有一点,必须要过中间这个点,比如从1开始,必须要经过2才可以到3。1是可以直接到6的,但通常这种设置比较少。运行附录的程序得到如下的数据:
size: 4 count0: 144 count1: 96 count2:40
size: 5 count0: 600 count1: 336 count2:152
size: 6 count0: 2880 count1: 1344 count2:304
size: 7 count0: 15120 count1: 4272 count2:496
size: 8 count0: 80640 count1: 18432 count2:1024
size: 9 count0: 362880 count1: 32256 count2:784
sum:  count0: 462264 count1: 56736 count2:2800
use time: 453ms例如:4个点组合可能有144种可能,排除飞点(1直接到3)的情况,剩下96种可能,如果不考虑跨点(1到6)的情况,仅剩下40种可能。所以得出的结论是:4-9个点任意组合的九宫格有56736种组合,排除跨点的情况,有2800种可能。
一般人设置在5-7个点,通常形状并不复杂的可能性仅为1000种左右,试出来的可能性还是很大的,而使用4位数字密码的组合则为10000种左右。
<pre name="code" class="java">package string;import java.security.InvalidParameterException;public class HowMany {public static void main(String[] args) {String[] except1 = new String[]{"46", "64", "28", "82", "19", "91", "37", "73","13", "31", "39", "93", "97", "79", "17", "71"};String[] except2 = new String[]{"16", "61", "18", "81", "34", "43", "38", "83","72", "27", "76", "67", "92", "29", "94", "49"};long lastTime = System.currentTimeMillis();long sum0 = 0;long sum1 = 0;long sum2 = 0;for (int i = 4; i <= 9; i++) {long count0 = 0;long count1 = 0;long count2 = 0;for (int j = 1; j <= 10 - i; j++) {Combines num = new Combines(j, i);String str;boolean flag1 = false;boolean flag2 = false;do {flag1 = false;flag2 = false;str = num.getOne();for (String except : except1) {if (str.contains(except)) {flag1 = true;break;}}for (String except : except2) {if (str.contains(except)) {flag2 = true;break;}}count0++;if (!flag1) {count1++;}if (!flag1 && !flag2) {count2++;//System.out.println(str);}} while (num.moveNext());}sum0 += count0;sum1 += count1;sum2 += count2;System.out.println("size: " + i + " count0: " + count0 + " count1: " + count1 + " count2:" + count2);}System.out.println("sum: " + " count0: " + sum0 + " count1: " + sum1 + " count2:" + sum2);System.out.println("use time: " + (System.currentTimeMillis() - lastTime) + "ms");}private static class Combines {private int base;private int[] number;private int[] poll;private long amount;private long count;public Combines(int start, int size) {if (size <= 1) {throw new InvalidParameterException();}base = start;number = new int[size];poll = new int[size];amount = this.jieCheng(size);this.reset();}public void reset() {initNumber();initPoll();count = 0;}public String getOne() {StringBuffer strBuf = new StringBuffer();for (int i = 0; i < poll.length; i++) {strBuf.append(getNumber(poll[i]));}return strBuf.toString();}public boolean moveNext() {if (++count < amount) {this.stepNext(1);this.initNumber();return true;} else {return false;}}private long jieCheng(int x) {long y = 1;for (int i = 1; i <= x; i++) {y = y * i;}return y;}private int getNumber(int index) {int num;for (int i = 0; i < number.length; i++) {if (number[i] != 0) {if (index == 0) {num = number[i];number[i] = 0;return num;}index--;}}return 0;}private void stepNext(int index) {if (poll[poll.length - 1 - index] == index) {this.stepNext(index + 1);poll[poll.length - 1 - index] = 0;} else {poll[poll.length - 1 - index]++;return;}}private void initNumber() {for (int i = 0; i < number.length; i++) {number[i] = i + base;}}private void initPoll() {for (int i = 0; i < poll.length; i++) {poll[i] = 0;}}}
}

解锁图案-九宫格有多少种组合?安全吗?用程序来解答相关推荐

  1. 有10元,5元,2元,1元四种面值的人民币,问组成100元钱有多少种组合?

    有10元,5元,2元,1元四种面值的人民币,问组成100元钱有多少种组合? 问题分析:  为了表达清楚,用  TEN , FIVE , TWO , ONE , 表示 10元,5元,2元,1元的人民币. ...

  2. 有n个数,从中取m个数,可以重复取,有多少种组合

    题目: 有n个数,从中取m个数,可以重复取,有多少种组合是123,321,312,321,213,123是一种组合.比如输入3,3,有10种,分别为,111,112,113,122,123,133,2 ...

  3. 用10元,20元,50元三种币值的纸币凑出1000元,一共有多少种组合(C++实现)三种思路,两种实现

    今天做了中金所的笔试题,被一道题卡住了.题目意思是: 用10元,20元,50元三种币值的纸币凑出1000元,一共有多少种组合? 当时一眼看上去分析了一下,以为是背包问题,类似于爬楼梯,于是直接带了爬楼 ...

  4. 给定一个只由 0、1、、|和^五种字符组成的字符串express,再给定一个布尔值 desired。返回express能有多少种组合方式,可以达到desired的结果。

    问题描述: 给定一个只由 0(假).1(真).&(逻辑与).|(逻辑或)和^(异或)五种字符组成的字符串express,再给定一个布尔值 desired.返回express能有多少种组合方式, ...

  5. 创新工场笔试题----有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?

    [题目]有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱? 代码如下 void Combination(int *a,int index,int n,v ...

  6. c语言字母数字有多少种组合,C语言------排列组合 组合情况(重复和不重复)

    组合不重复数 问题引入: 1.不重复的情况: 例如ABCDE,让你从里面选出3个,问你一共有多少种可能,我们可以直接递归进行列举一共有多少种.下面看代码: #include intm,n;int f( ...

  7. Android解锁图案共有多少种?

    九个点 每个点只能连一次 ,如果两个点AB之间有其他点C,在C点被使用之前AB不能直接相连 两种解法 一种是直接用简单的9个循环 #include <stdio.h>int main(){ ...

  8. android图案怎么解锁,Android解锁图案共有多少种?

    九个点 每个点只能连一次 ,如果两个点AB之间有其他点C,在C点被使用之前AB不能直接相连 两种解法 一种是直接用简单的9个循环 #include int main(){ int count=0; f ...

  9. 如何利用Excel计算有多少种组合?

    上期文章给大家推荐了关于函数公式的三个高级的用法,分别是查找出现频率最高,最接近的数据以及定位字符串中出现的第一个汉字的位置.为了提高大家对公式与函数的理解能力与逻辑能力,今天小必老师给大家再次介绍一 ...

  10. 求C n m(从n个数中选m个数,有多少种组合?问题)暴力—递归——回归数学公式,三种方法,层层优化!

    文章将以代码+解析(简单)的方式进行,欢迎大家的阅读! 首先,任何一个问题都是有来源的,所以请先看题(我遇到的): 暴力解法(我第一次的想法) 代码如下: #include <stdio.h&g ...

最新文章

  1. 用dblink能修改_【学习笔记】通过修改基表(link$)让非public dblink变为public
  2. 程序图形化界面刷新以及如何从tkinter窗口中正确读出数据
  3. docker与jenkins学习
  4. 【学习笔记】路由算法与路由协议:RIP协议与距离向量算法、OSPF协议与链路状态算法、BGP协议
  5. PostgreSQL13逻辑备份pg_dump
  6. 借助neo4j-admin导入csv文件构建实体与联系
  7. 如何正确使用 FLEX-BOX
  8. windows服务初识
  9. ssh工具的使用(全平台运行)
  10. 计算机acm国际排名,acm(中国大学acm综合排名)
  11. MSL、TTL、RTT
  12. cloudera-repos 地址
  13. background-image图片不存在时显示默认照片
  14. wps如何用循环函数_WPS版Excel中怎样使用函数进行运算
  15. Java垃圾回收与算法
  16. RestoreDet
  17. JVM性能调优5_编写高效优雅Java程序__享学课堂
  18. java生成条形码和二维码
  19. pointofix 全局快捷键_Pointofix下载
  20. 优优加速cdn带宽_cdn加速原理是什么,正常1m宽带服务器能提升多少速度-问答-阿里云开发者社区-阿里云...

热门文章

  1. 程序猿如何更好地指导自己处于什么水平,还有各个阶段应该学习什么
  2. Windows7安装包中打开WIM文件并提取系统文件
  3. Hopscotch(POJ-3050)
  4. 理解风险偏好risk appetite vs. 风险容忍度risk tolerance
  5. Java 基础系列(七) --- 透彻学习Java的接口
  6. 暴笑新东方老师老罗语录(转)
  7. 网站排名不好的解决方法
  8. 练习-Java循环综合练习四之日历打印
  9. java:定义一个Shape类,派生出Circle类和Rectangle类,手写模拟GeoArrayList,实现升序(升序以面积大小判断)存入Circle类和Rectangle类
  10. Linux登录mysql密码正确被拒绝访问