zoukankan      html  css  js  c++  java
  • 随机生成九宫格图形密码-实现

    无意看到某次面试没有通过后,在家苦练基本功后重新写的一串代码。

    方法千万种,以下是我印象最深的,回头看还是觉得挺有学习意义的,所以发出来共享学习。

    原问题条件不记得太清,大致实现的是:随机生成九宫格图形(手势)密码

    读题,有几个点需要主要:
    1、密码长度可设置

    2、手势密码的路径必须可直达

    用两种方式实现:

    1、canArr 判断前后数值是否可直达

    2、getNum 根据前一个数值获取下一个数值

    package com.maomao;
    
    import org.testng.annotations.Test;
    import java.util.HashMap;
    import java.util.Map;
    
    //随机生成九工格图形密码,随机数范围1~9
    public class RandomScret {
    
        //9工格中,1~9可直达的数值,发现规律
        //除了5
        //奇数,1,3,7,9,四个角无法直达
        //偶数,2,4,6,8,对角无法直达,并且对角和5的差值相同
        //    int[] num_1={2,4,5,6,8};
        //    int[] num_2={1,3,4,5,6,7,9};
        //    int[] num_3={2,4,5,6,8};
        //    int[] num_4={1,2,3,5,7,8,9};
        //    int[] num_5={1,2,3,4,6,7,8,9};
        //    int[] num_6={1,2,3,5,7,8,9};
        //    int[] num_7={2,4,5,6,8};
        //    int[] num_8={1,3,4,5,6,7,9};
        //    int[] num_9={2,4,5,6,8};
    
        //获取1~9的随机整数
        //( n~m随机数公式:(int)(Math.random()*(m-n+1) +n)))
        public static int getRandomNum(){
            int num=(int)(Math.random()*9+1);
            return num;
        }
    
        //判断是否可以抵达 -----这种方式需要不停试错,花费时间较长
        public Boolean canArr(int preNum,int randomNum){
            //做标记,默认不可以抵达
            boolean flag = false;
            //前后值不能相等
            if (preNum!=randomNum){
                if (preNum==5 ) {
                    flag = true;
                }else if (randomNum==5){
                    flag = true;
                }else if (preNum%2==0){ //是偶数
                    int n=Math.abs(preNum-5);
                    int m=Math.abs(randomNum-5);
                    if (n!=m){
                        flag=true;
                    }
                }else if (preNum%2==1){ //preNum是除了5以外的奇数
                    if (randomNum%2==0){
                        flag=true;
                    }
                }
            }
    
            return flag;
        }
    
        //构造可直达路径 ------这种方式占用内存,花费时间短
        public Map<Integer,int[]> All() {
            Map<Integer, int[]> map = new HashMap<>();
            map.put(1,new int[]{2,4,5,6,8});
            map.put(2,new int[]{1,3,4,5,6,7,9});
            map.put(3,new int[]{2,4,5,6,8});
            map.put(4,new int[]{1,2,3,5,7,8,9});
            map.put(5,new int[]{1,2,3,4,6,7,8,9});
            map.put(6,new int[]{1,2,3,5,7,8,9});
            map.put(7,new int[]{2,4,5,6,8});
            map.put(8,new int[]{1,3,4,5,6,7,9});
            map.put(9,new int[]{2,4,5,6,8});
    
            return map;
        }
        public int getNum(int preNum){
    //        int tag=(int)(Math.random()*10);
            int[] nextArr=All().get(preNum);
            int tag=(int)(Math.random()*10+1);//1~10
            int next=nextArr[tag%nextArr.length];
            return next;
        }
    
        @Test
        public void test1(){
            RandomScret rs=new RandomScret();
    
            //设置密码长度length
            int length=6;
            int[] scret=new int[length];
    
            //指定生成
            int preNum=getRandomNum();
            for (int i=0;i<length;i++){
                scret[i]=rs.getNum(preNum);
                preNum=scret[i];
            }
    
            for (int num:scret){
                System.out.println(num);
            }
        }
    
        @Test
        public void test2(){
            RandomScret rs=new RandomScret();
    
            //设置密码长度length
            int length=6;
            int[] scret=new int[length];
    
            //随机生成
            int preNum=getRandomNum();
            for (int i=0;i<length;){
                int randomNum=getRandomNum();
                if (rs.canArr(preNum,randomNum)){
                    scret[i]=randomNum;
                    preNum=scret[i];
                    i++;
                }else {
                    continue;
                }
            }
    
            for (int num:scret){
                System.out.println(num);
            }
        }
    }
  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/fatCat1/p/12877420.html
Copyright © 2011-2022 走看看