如何用java猜四位数密码?

猜密码:
3 6 2 8 其中一个数字正确且位置正确
7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对
1 4 2 9 一个数字正确,位置不对
4 5 7 6 一个数字正确且位置正确
以上条件成立,且四位密码数字不重复,实用java程序实现。
有点类似力扣里的猜数字问题,这个问题仅用java基础进行编写(数组或者字符串,哈希和list不能用),大概都是暴力穷举,希望网友们多多参与讨论。

只用了些基础的方式,算法很简单,只要计算一下位置正确且数字正确的个数和数字正确的个数,然后和你给的条件暴力枚举即可

    public static void main(String[] args) {
        // 枚举法 out: 0518 3510
        String str1 = "3628";
        String str2 = "7019";
        String str3 = "1429";
        String str4 = "4576";

        for (int i = 0; i <= 9999; i++) {
            // 补0
            String cur = String.format("%04d", i);
            if (!check(cur, str1, 1, 1)) continue;
            if (!check(cur, str2, 1, 2)) continue;
            if (!check(cur, str3, 0, 1)) continue;
            if (!check(cur, str4, 1, 1)) continue;
            System.out.println("密码:" + cur);
        }
    }

    public static boolean check(String target, String condition, int targetPos, int targetSame) {
        int[] cnt1 = new int[10];
        int[] cnt2 = new int[10];
        // 位置正确且数字正确个数
        int posCnt = 0;
        for (int i = 0; i < 4; i++) {
            char c1 = target.charAt(i);
            char c2 = condition.charAt(i);
            cnt1[c1 - '0']++;
            cnt2[c2 - '0']++;
            // 重复数字直接返回false
            if (cnt1[c1 - '0'] > 1) return false;
            if (c1 == c2) posCnt ++;
        }
        // 数字正确个数
        int sameCnt = 0;
        for (int i = 0; i < 10; i++) {
            sameCnt += Math.min(cnt1[i], cnt2[i]);
        }
        return posCnt == targetPos && sameCnt == targetSame;
    }

输出

密码:0518
密码:3510

c++可以吗

暴力穷举 yyds

完整代码如下

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Answer7746371 {

    public static void main(String[] args) {
        Random random = new Random();
        int[] answer = randomDiff4();
        System.out.println(Arrays.toString(answer));

        System.out.println("猜四位数密码游戏开始");
        Scanner scanner = new Scanner(System.in);
        while(true) {
            try {
                String line = scanner.nextLine();
                String[] inputs = line.split(" ");
                int[] inputInt = new int[answer.length];
                for(int i=0; i<inputInt.length; ++i) {
                    inputInt[i] = Integer.parseInt(inputs[i]);
                }
                if(match(inputInt, answer)) {
                    break;
                }
            } catch (Exception e) {

            }
        }
    }

    /**
     * 随机生成4个不一样的整数
     */
    public static int[] randomDiff4() {
        Random random = new Random();
        int[] answer = {-1, -1, -1, -1};
        int alreadRandom = 0;
        for(int i=0; i<answer.length; ++i) {
            while(true) {
                int r = random.nextInt(10);
                boolean find = false;
                for(int j=0; j<alreadRandom; ++j) {
                    if(answer[j] == r) {
                        find = true;
                        break;
                    }
                }
                if(!find) {
                    answer[alreadRandom++] = r;
                    break;
                }
            }

        }
        return answer;
    }

    public static boolean match(int[] input, int[] answer) {
        int size = answer.length;
        // 数字正确的个数
        int numCount = 0;
        // 位置正确的个数
        int positionCount = 0;
        for(int i=0; i<size; ++i) {
            for(int j=0; j<size; ++j) {
                if(answer[i] == input[j]) {
                    numCount++;
                    if(i==j) {
                        positionCount++;
                    }
                    break;
                }
            }
        }

        if(positionCount == answer.length) {
            System.out.println("恭喜你,猜对了!");
            return true;
        }

        if(numCount == 0) {
            System.out.println(numCount + "个数字正确");
            return false;
        }

        if(numCount == positionCount) {
            System.out.println(numCount + "个数字正确且位置正确");
            return false;
        }

        System.out.println(numCount + "个数字正确," + "其中" + positionCount + "个位置正确," + (numCount-positionCount) + "个位置不对");
        return false;
    }
}

运行结果如下

猜四位数密码游戏开始
5 3 2 1
1个数字正确且位置正确
5 2 3 1
1个数字正确且位置正确

5 8 4 0
4个数字正确,其中2个位置正确,2个位置不对
5 4 8 0
恭喜你,猜对了!

如有帮助,请采纳,十分感谢!

望采纳

package com.example.demo.Test;

public class Test {
    public static void main(String[] args) {

        for (int i = 1000; i < 9999; i++) {
            int g = i % 10;
            int s = i / 10 % 10;
            int ba = i / 100 % 10;
            int q = i / 1000 % 10;

            if (a(g, s, ba, q) && b(g, s, ba, q)&&c(g, s, ba, q) && d(g, s, ba, q)) {
                if(q!=ba&&q!=g&&q!=s&&ba!=s&&ba!=g&&s!=g)
                System.out.println(i);
            }

        }


/*        int a=1234;
        System.out.printf(String.valueOf(a/10%10));
        */

    }

/*3 6 2 8 其中一个数字正确且位置正确
7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对
1 4 2 9 一个数字正确,位置不对
4 5 7 6 一个数字正确且位置正确*/


    public static boolean a(int g, int s, int ba, int q) {
        if ((g == 8 && s != 2 && ba != 6 && q != 3) || (s == 2 && g != 8 && ba != 6 && q != 3) || (g != 8 && s != 2 && ba == 6 && q != 3) || g != 8 && s != 2 && ba != 6 && q == 3) {
            return true;
        } else {
            return false;
        }
    }

    /*1429*/
    public static boolean b(int g, int s, int ba, int q) {
        if ((q == 4 || q == 2 || q == 9) && (ba != 4 && s != 2 && g != 9)) {
            return true;
        } else if ((ba == 1 || ba == 2 || ba == 9) && (q != 1 && s != 2 && g != 9)) {
            return true;

        } else if ((s == 1 || s == 4 || s == 9) && (g != 9 || q != 1 || ba != 4)) {
            return true;

        } else if ((q != 1 && ba != 4 && s != 2) && (g == 1 || g == 4 || g == 2)) {
            return true;
        } else {
            return false;
        }
    }
    /*7 0 1 9 */
    public static boolean c(int g, int s, int ba, int q) {

        /*只有一个正确位置的数字*/
        if ((g == 9 && s != 1 && ba != 0 && q != 7)) {
            /*7 0 1 9*/
            /*当只有一个数字正确,但位置不正确*/
            if (((q == 0 || q == 1 ) && (ba!=1&&ba!= 9&&ba!=0&&ba!=7&&s!=1&&s!= 9&&s!=0&&s!=7))) {
                return true;

            } else if (((ba == 7 || ba == 1) && (s!=1&&s!= 9&&s!=0&&s!=7&&q!=1&&q!= 9&&q!=0&&q!=7))) {
                return true;

            } else if (((s == 7 || s == 0 ) && (ba!=1&&ba!= 9&&ba!=0&&ba!=7&&q!=1&&q!= 9&&q!=0&&q!=7))) {

                return true;
            }  else {
                return false;
            }
        } else if ((g != 9 && s == 1 && ba != 0 && q != 7)) {
            if (((q == 0 || q == 9) && ( ba!=1&&ba!= 9&&ba!=0&&ba!=7&&g!=1&&g != 9&&g!=0&&g!=7))) {
                return true;

            } else if (((ba == 7 || ba == 9) && (q!=1&&q!= 9&&q!=0&&q!=7&&g!=1&&g != 9&&g!=0&&g!=7))) {
                return true;

            } else if (((q!=1&&q!= 9&&q!=0&&q!=7&&ba!=1&&ba!= 9&&ba!=0&&ba!=7 ) && (g == 7 || g == 0 ))) {
                return true;
            } else {
                return false;
            }
        } else if ((g != 9 && s != 1 && ba == 0 && q != 7)) {
            if ((( q == 1 || q == 9) && ( s!=1&&s!= 9&&s!=0&&s!=7&&g!=1&&g != 9&&g!=0&&g!=7))) {
                return true;
            } else if (((s == 7 || s == 9) && ( g!=1&&g != 9&&g!=0&&g!=7&&q!=1&&q != 9&&q!=0&&q!=7 ))) {
                return true;
            } else if (((q!=1&&q != 9&&q!=0&&q!=7&&s!=1&&s!= 9&&s!=0&&s!=7) && (g == 7  || g == 1))) {
                return true;
            } else {
                return false;
            }
        } else if ((g != 9 && s != 1 && ba != 0 && q == 7)) {
           if ((( ba == 1 || ba == 9) && (g!=1&&g!= 9&&g!=0&&g!=7&&s!=1&&s!= 9&&s!=0&&s!=7 ))) {
                return true;

            } else if ((( s == 0 || s == 9) && (ba!=1&&ba!= 9&&ba!=0&&ba!=7&&g!=1&&g!= 9&&g!=0&&g!=7))) {

                return true;
            } else if (((ba!=1&&ba!= 9&&ba!=0&&ba!=7&&s!=1&&s!= 9&&s!=0&&s!=7) && ( g == 0 || g == 1))) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    public static boolean d(int g, int s, int ba, int q) {
        if ((g == 6 && s != 7 && ba != 5 && q != 4) || (g != 6 && s == 7 && ba != 5 && q != 4) || (g != 6 && s != 7 && ba == 5 && q != 4) || (g != 6 && s != 7 && ba != 5 && q == 4)) {
            return true;
        } else {
            return false;
        }
    }

}

运行结果


Connected to the target VM, address: '127.0.0.1:56169', transport: 'socket'
2078
3072
3074
3096
3510
3517
3716
3916
4098
4610
4617
4718
4918
7598
9518
Disconnected from the target VM, address: '127.0.0.1:56169', transport: 'socket'

Process finished with exit code 0

万物皆可暴力

答案:0518,3510

img

解题思路:

  • 数字比对的方法
  • 如果数字对了,位置不对 则显示 nB,n代表有几个数字是正确且位置是不对的。
  • 如果数字对了,位置也是对的 则显示mA,m代表有几个数字是正确的且位置也是正确的。
  • 3 6 2 8 其中一个数字正确且位置正确. 1A0B
  • 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B
  • 1 4 2 9 一个数字正确,位置不对. 0A1B
  • 4 5 7 6 一个数字正确且位置正确 1A0B
  • 1A0B + 1A1B + 0A1B + 1A0B = 3A2B
  • 当结果输出3A2B时表示密码匹配正确
  • @return 3A2B

代码实现:

public class GuessPasswordTest {
  /**
   * 猜密码: <br>
   * 3 6 2 8 其中一个数字正确且位置正确.<br>
   * 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. <br>
   * 1 4 2 9 一个数字正确,位置不对. <br>
   * 4 5 7 6 一个数字正确且位置正确 以上条件成立,且四位密码数字不重复,实用java程序实现。<br>
   * 有点类似力扣里的猜数字问题,这个问题仅用java基础进行编写(数组或者字符串,哈希和list不能用)
   */
  public static void main(String[] args) {
    guessPassword();
  }

  public static int[] guessPassword() {
    int[] arr = new int[4];
    String pwd = "";
    // 0-9中 4位不重复的数字组合排列
    for (int i = 1; i < 10000; i++) {
      pwd = String.format("%04d", i);
      String sub1 = pwd.substring(0, 1);
      String sub2 = pwd.substring(1, 2);
      String sub3 = pwd.substring(2, 3);
      String sub4 = pwd.substring(3, 4);
      if (!Objects.equals(sub1, sub2)
          && !Objects.equals(sub1, sub3)
          && !Objects.equals(sub1, sub4)
          && !Objects.equals(sub2, sub3)
          && !Objects.equals(sub2, sub4)
          && !Objects.equals(sub3, sub4)) {
        arr[0] = Integer.parseInt(sub1);
        arr[1] = Integer.parseInt(sub2);
        arr[2] = Integer.parseInt(sub3);
        arr[3] = Integer.parseInt(sub4);
        // 与已知密码匹配,当匹配度为3A2B时输出密码
        String compare = compare(arr);
        if ("3A2B".equals(compare)) {
          System.out.println("pwd: " + pwd);
          System.out.println("compare: " + compare);
         // break;
        }
      }
    }
    return arr;
  }

  /**
   * answer1输出为 1A0B <br>
   * answer2输出为 1A1B <br>
   * answer3输出为 0A1B <br>
   * answer4输出为 1A0B <br>
   *
   * @param inputs 输入密码
   * @param answer 匹配四种答案
   * @return 匹配成功
   */
  public static String compare(int[] inputs, int[] answer) {
    int aA = 0;
    int bB = 0;
    for (int i = 0; i < answer.length; i++) {
      for (int j = 0; j < inputs.length; j++) {
        if (inputs[j] == answer[i] && i == j) {
          aA += 1;
        } else if (inputs[j] == answer[i] && i != j) {
          bB += 1;
        }
      }
    }
    return "" + aA + "A" + bB + "B";
  }

  /**
   * 数字比对的方法 <br>
   * 3 6 2 8 其中一个数字正确且位置正确. 1A0B <br>
   * 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B <br>
   * 1 4 2 9 一个数字正确,位置不对. 0A1B <br>
   * 4 5 7 6 一个数字正确且位置正确 1A0B <br>
   * 1A0B + 1A1B + 0A1B + 1A0B = 3A2B<br>
   * 当结果输出3A2B时表示密码匹配正确
   *
   * @return 3A2B
   */
  public static String compare(int[] inputs) {
    /**
     * 如果数字对了,位置不对 则显示 nB,n代表有几个数字是正确且位置是不对的。<br>
     * 如果数字对了,位置也是对的 则显示mA,m代表有几个数字是正确的且位置也是正确的。
     */
    int mA = 0;
    int nB = 0;
    String str = "";

    // 3 6 2 8 其中一个数字正确且位置正确. 1A0B ,
    int[] answer1 = {3, 6, 2, 8};
    // 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B
    int[] answer2 = {7, 0, 1, 9};
    // 1 4 2 9 一个数字正确,位置不对. 0A1B
    int[] answer3 = {1, 4, 2, 9};
    // 4 5 7 6 一个数字正确且位置正确 1A0B
    int[] answer4 = {4, 5, 7, 6};

    // 1A0B
    // 3 6 2 8 其中一个数字正确且位置正确. 1A0B ,
    String str1 = compare(inputs, answer1);

    if ("1A0B".equals(str1)) {
      mA += 1;
      // 1A1B
      // 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B
      String str2 = compare(inputs, answer2);
      if ("1A1B".equals(str2)) {
        mA += 1;
        nB += 1;
        // 0A1B
        // 1 4 2 9 一个数字正确,位置不对. 0A1B
        String str3 = compare(inputs, answer3);
        if ("0A1B".equals(str3)) {
          nB += 1;
          // 1A0B
          // 4 5 7 6 一个数字正确且位置正确 1A0B
          String str4 = compare(inputs, answer4);
          if ("1A0B".equals(str4)) {
            mA += 1;
          }
        }
      }
    }
    str = "" + mA + "A" + nB + "B";
    return str;
  }
}

  public static void main(String[] args) {
        String one="";
        String two="";
        String three="";
        String four="";
        for (int i = 1000; i <= 9999; i++) {
            String number = String.valueOf(i);
            if (Strings.indexContains(number,one)
                    && Strings.indexContainsAndanyContains(number,two)
                    && Strings.anyContains(number,three)
                    && Strings.indexContains(number,four)
                    &&!Strings.district(number)) {
                System.out.println(number);
                
            }
        }
    }
    static class Strings{
        public static boolean anyContains(String sc,String cs){
            String[] split = cs.split("");
            for (String s : split) {
                if (sc.contains(s)){
                    return true;
                }
            }
            return false;
        }
        public static boolean district(String sc){
            String[] split = sc.split("");
            for (int i = 0; i < split.length; i++) {
                for (int i1 = split.length - 1; i1 >= 0; i1--) {
                    if (split[i].equals(split[i1])&&i!=i1)
                        return true;
                }
            }
            return false;
        }
        public static boolean indexContains(String sc,String cs){
            String[] split = cs.split("");
            String[] scsplit = sc.split("");
            for (int i = 0; i < scsplit.length; i++) {
                for (int i1 = 0; i1 < split.length; i1++) {
                    if (scsplit[i].equals(split[i1])&&i==i1) {
                        return true;
                    }
                }
            }
            return false;
        }
        public static boolean indexContainsAndanyContains(String sc,String cs){
                String[] split = cs.split("");
                String[] scsplit = sc.split("");
                for (int i = 0; i < scsplit.length; i++) {
                    for (int i1 = 0; i1 < split.length; i1++) {
                        if (scsplit[i].equals(split[i1])&&i==i1) {
                            String temp=split[i1];
                            split[i1]="-1";
                            if (anyContains(String.join("",scsplit),String.join("",split)))
                            return true;
                            split[i1]=temp;
                        }

                    }
                }
                return false;

        }
    }

这是我的办法

img

img

https://blog.csdn.net/wenheya/article/details/104672704/ 这有代码