先看看原题:
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万次左右找到答案;
有优化的地方还请指教!