猜密码:
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
解题思路:
代码实现:
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;
}
}
这是我的办法
https://blog.csdn.net/wenheya/article/details/104672704/ 这有代码