java2018刑侦推理题

先看看原题:

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万次左右找到答案;

有优化的地方还请指教!


猜你喜欢

转载自blog.csdn.net/u011165335/article/details/79512363