先看看原题:
1.这道题的答案是:
A.A B.B C.C D.D
2.第五题的答案是:
A.C B.D C.A D.B
3.以下选项中哪一题的答案与其他三项不同:
A第3题 B.第6题 C.第2题 D.第4题
4.以下选项中那两题的答案相同:
A.第1,5题 B.第2,7题 C.第1,9题 D.第6,10题
5.以下选项中哪一题的答案与本题相同:
A.第8题 B.第4题 C.第9题 D.第7题
6.以下选项中哪2题的答案与第8题相同:
A.第2,4题 B.第1,6题 C.第3,10题 D.第5,9题
7.在此10道题中,被选中次数最少的选项字母为:
A.C B.B C.A D.D
8.以下选项中哪一题的答案与第一题的答案在字母中不相邻:
A.第7题 B.第5题 C.第2题 D.第10题
9.已知"第一题与第6题的答案相同" 与 "第X题与第5题的答案相同"的真假性相反,那么X为:
A.第6题 B.第10题 C.第2题 D.第9题
10.在此10道题中,ABCD四个字母出现次数最多与最少者的差为:
A.3 B.2 C.4 D.1
分析:
1.答案唯一
2.第三题答案为A
使用代码循环硬解:
// by yushaoyang 2018-03
public class 刑侦题2018 {
@Test
public void testName() throws Exception {
char select[] = { 'A', 'B', 'C', 'D' };
char ans[] = new char[10];
int count = 0;
loop1: for (char c1 : select) {
for (char c2 : select) {
for (char c3 : select) {
for (char c4 : select) {
for (char c5 : select) {
for (char c6 : select) {
for (char c7 : select) {
for (char c8 : select) {
for (char c9 : select) {
ans[0] = c1;
ans[1] = c2;
ans[2] = 'A';
ans[3] = c3;
ans[4] = c4;
ans[5] = c5;
ans[6] = c6;
ans[7] = c7;
ans[8] = c8;
ans[9] = c9;
if (checkAns(ans)) {
System.out.println("答案:" + Arrays.toString(ans));
System.out.println("查找次数:" + count);
break loop1;
}
count++;
}
}
}
}
}
}
}
}
}
}
// 第二题
private boolean check1(char[] ans) {
switch (ans[1]) {
case 'A':
return ans[4] == 'C';
case 'B':
return ans[4] == 'D';
case 'C':
return ans[4] == 'A';
case 'D':
return ans[4] == 'B';
default:
return false;
}
}
// 第三题A
// 第四题
private boolean check2(char[] ans) {
switch (ans[3]) {
case 'B':
return ans[1] == ans[6];
case 'C':
return ans[0] == ans[8];
case 'D':
return ans[5] == ans[9];
default:
return false;
}
}
// 第5题
private boolean check3(char[] ans) {
switch (ans[4]) {
case 'A':
return ans[7] == 'A';
case 'B':
return ans[3] == 'B';
case 'C':
return ans[8] == 'C';
case 'D':
return ans[6] == 'D';
default:
return false;
}
}
// 第6题
private boolean check4(char[] ans) {
switch (ans[5]) {
case 'A':
return (ans[1] == ans[3]) && (ans[3] == ans[7]);
case 'B':
return (ans[0] == ans[5]) && (ans[5] == ans[7]);
case 'C':
return (ans[2] == ans[9]) && (ans[9] == ans[7]);
case 'D':
return (ans[4] == ans[8]) && (ans[8] == ans[7]);
default:
return false;
}
}
// 第7题
private boolean check5(char[] ans) {
int minCount = getMinCount(ans);
switch (ans[6]) {
case 'A':
// 注意这里的转换思路
return getCount('C', ans) == minCount;
case 'B':
return getCount('B', ans) == minCount;
case 'C':
return getCount('A', ans) == minCount;
case 'D':
return getCount('D', ans) == minCount;
default:
return false;
}
}
// 第8题
private boolean check6(char[] ans) {
switch (ans[7]) {
case 'A':
return Math.abs(ans[0] - ans[6]) > 1;
case 'B':
return Math.abs(ans[0] - ans[4]) > 1;
case 'C':
return Math.abs(ans[0] - ans[1]) > 1;
case 'D':
return Math.abs(ans[0] - ans[9]) > 1;
default:
return false;
}
}
// 第9题
private boolean check7(char[] ans) {
switch (ans[8]) {
case 'A':
return (ans[0] == ans[5] || ans[4] == ans[5]);
case 'B':
return (ans[0] == ans[5] || ans[4] == ans[9]);
case 'C':
return (ans[0] == ans[5] || ans[4] == ans[1]);
case 'D':
return (ans[0] == ans[5] || ans[4] == ans[8]);
default:
return false;
}
}
// 第10题
private boolean check8(char[] ans) {
int result = getSubCount(ans);
switch (ans[9]) {
case 'A':
return result == 3;
case 'B':
return result == 2;
case 'C':
return result == 4;
case 'D':
return result == 1;
default:
return false;
}
}
// 在本需求中,只需要比较值就可以了
private int getMinCount(char[] ans) {
List<Integer> list = new ArrayList<>();
list.add(getCount('A', ans));
list.add(getCount('B', ans));
list.add(getCount('C', ans));
list.add(getCount('D', ans));
return Collections.min(list);
}
// 最大值-最小值
private int getSubCount(char[] ans) {
List<Integer> list = new ArrayList<>();
list.add(getCount('A', ans));
list.add(getCount('B', ans));
list.add(getCount('C', ans));
list.add(getCount('D', ans));
return Collections.max(list) - Collections.min(list);
}
// 求单个字母的个数
private int getCount(char c, char[] ans) {
int count = 0;
for (char d : ans) {
if (d == c) {
count++;
}
}
return count;
}
// 检查
private boolean checkAns(char[] ans) {
return check1(ans) && check2(ans) && check3(ans) && check4(ans) && check5(ans) && check6(ans) && check7(ans)
&& check8(ans);
}
// 答案:[B, C, A, C, A, C, D, A, B, A]
// 查找次数:107204
}
可以看到,循环为10万次左右找到答案;
有优化的地方还请指教!