题目描述
一个人设定一组四码的数字作为谜底,另一方猜,
每猜一个数,出数者就要根据这个数字给出提示,提示以XAYBXAYBXAYB形式呈现,直到猜中位置。
其中XXX表示位置正确的数的个数(数字正确且位置正确),而YYY表示数字正确而位置不对的数的个数。
例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B.
例如,当谜底为5637,而猜谜者才4931时,出题者必须提示1A0B.
当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。
输入描述
第一行输入一个正整数,0<N<1000<N < 1000<N<100.
接下来 NNN 行,每一行包含一个猜测的数字与提示结果。
输出描述
输出最后的答案,答案不确定则输出NA。
示例1
输入
6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B
输出
3585
题解
暴力破解,
遍历 1000 ~ 9999
逐个匹配
注: 一个数字猜对后不可再次使用
源码Java
public class GuessNUmber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
List<String[]> guesses = new ArrayList<>();
for (int i = 0; i < n; i++) {
String s = scanner.nextLine();
String[] guess = s.split(" ");
guesses.add(guess);
}
List<Integer> results = new ArrayList<>();
for (int i = 1000; i < 10000; i++) {
for (int ii = 0; ii <= guesses.size() ; ii++) {
if (ii == guesses.size()) {
// 如果所有猜测都符合则加入结果集合
results.add(i);
continue;
}
String result = getString(i+"", guesses.get(ii)[0]);
if (!result.equals(guesses.get(ii)[1])) {
break;
}
}
// 出现非唯一结果则结束
if (results.size() > 1) {
break;
}
}
if (results.size() == 1) {
System.out.println(results.get(0));
} else {
System.out.println("NA");
}
}
// 返回猜测结果
private static String getString(String tar, String num) {
int allRight = 0;
int numRight = 0;
char[] tars = tar.toCharArray();
char[] nums = num.toCharArray();
for (int j = 0; j < nums.length; j++) {
if (tar.charAt(j) == num.charAt(j)) {
allRight++;
// 猜对的数字修改为特殊字符
tars[j] = '#';
nums[j] = '_';
}
}
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < tars.length; j++) {
if (tars[j] == nums[i]) {
numRight++;
// 猜对的数字修改为特殊字符
tars[j] = '#';
nums[j] = '_';
break;
}
}
}
String result = allRight + "A" + numRight + "B";
return result;
}
}