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);
            }
        }
    }
  • 相关阅读:
    [swustoj 411] 售货员的难题
    白书P61
    白书P60
    [ZOJ 3471] Most Powerful
    [HDU 3001] Travelling
    [转] acmer必看的26个对acm态度
    [HDU 1254] 推箱子
    [POJ 3311] Hie with the Pie
    [POJ 3254] Corn Fields
    power
  • 原文地址:https://www.cnblogs.com/fatCat1/p/12877420.html
Copyright © 2011-2022 走看看