這段時間各種社交群和朋友圈火起來一個刑偵推理題,這是 3月1日“@江蘇網(wǎng)警”在微博上發(fā)布了一套試題澎媒「惴Γ看了兩眼覺得推理太麻煩,試試代碼群舉出答案看看戒努。原題如圖
一些簡單的可行性分析
10道題请敦,每個題四個群舉次數(shù)4的10次方镐躲。雖然時間復雜度O(n^10) 還好n是4。0.0迷之尷尬……
java代碼
public static void answer(){
//用1234分別對應ABCD侍筛,計算方便
int[] answers = {1,2,3,4};
//群舉答案
for (int q1 : answers) {
for (int q2 : answers) {
for (int q3 : answers) {
for (int q4 : answers) {
for (int q5 : answers) {
for (int q6 : answers) {
for (int q7 : answers) {
for (int q8 : answers) {
for (int q9 : answers) {
for (int q10 : answers) {
int[] questions = new int[10];
questions[0] = q1;
questions[1] = q2;
questions[2] = q3;
questions[3] = q4;
questions[4] = q5;
questions[5] = q6;
questions[6] = q7;
questions[7] = q8;
questions[8] = q9;
questions[9] = q10;
if (isEnd(questions)){
//遍歷輸出符合條件的答案
for (int i = 0 ; i < 10; i++){
System.out.println((i+1) + ":" + questions[i]);
}
}
}
}
}
}
}
}
}
}
}
}
}
/**
*判斷每個答案是否符合題意
*為了方便questions數(shù)組中從0開始萤皂,
*題目比數(shù)組角標多1(不要問為什么,奏是這么開)
*比如question[0] 的值表示第1題答案
**/
static boolean isEnd(int[] questions){
//第二題匣椰,第5題的答案是
switch (questions[4]){
case 1:
//如果第5題答案是A裆熙,判斷第2題答案是不是C。不是返回false禽笑,是繼續(xù)
if(questions[1] != 3)
return false;
break;
case 2:
//原理同上
if(questions[1] != 4)
return false;
break;
case 3:
//原理同上
if(questions[1] != 1)
return false;
break;
case 4:
//原理同上
if(questions[1] != 2)
return false;
break;
}
//第3題入录,以下選項中哪一題的答案與其他三項不同
switch (questions[2]){
case 1:
if(!(questions[2]!=questions[5] && questions[5]==questions[1] && questions[1] == questions[3]))
return false;
break;
case 2:
if(!(questions[5]!=questions[2] && questions[2]==questions[1] && questions[1] == questions[3]))
return false;
break;
case 3:
if(!(questions[1]!=questions[5] && questions[2]==questions[5] && questions[5] == questions[3]))
return false;
break;
case 4:
if(!(questions[3]!=questions[5] && questions[5]==questions[1] && questions[1] == questions[2]))
return false;
break;
}
//第4題,以下選項中那兩題的答案相同
switch (questions[3]){
case 1:{
//判斷第1題與第5題答案是否相同
if (questions[0] != questions[4]){
return false;
}
break;
}
case 2:{
//原理同上
if (questions[1] != questions[6]){
return false;
}
break;
}
case 3:{
//原理同上
if (questions[0] != questions[8]){
return false;
}
break;
}
case 4:{
//原理同上
if (questions[5] != questions[9]){
return false;
}
break;
}
}
//第5題佳镜,以下選項中哪一題的答案與本題相同
switch (questions[4]){
case 1:
//判斷第8題答案是否是A
if (questions[7] != 1)
return false;
break;
case 2:
//原理同上
if(questions[3] != 2)
return false;
break;
case 3:
//原理同上
if (questions[8] != 3)
return false;
case 4:
//原理同上
if (questions[6] != 4)
return false;
break;
}
//第6題僚稿,以下選項中哪兩題的答案與第8題相同
switch (questions[5]){
case 1:
//判斷第1、4題答案是否與第8題答案相同
if(questions[1] != questions[7] || questions[4] != questions[7])
return false;
break;
case 2:
//原理同上
if(questions[0] != questions[7] || questions[5] != questions[7])
return false;
break;
case 3:
//原理同上
if(questions[2] != questions[7] || questions[9] != questions[7])
return false;
break;
case 4:
//原理同上
if(questions[4] != questions[7] || questions[8] != questions[7])
return false;
break;
}
//由于第7蟀伸、10題問題是同類型的蚀同,所以一塊計算 。start
int[] check10 = new int[5];
//把每個題的答案(1啊掏、2蠢络、3、4)作為新數(shù)組下表脖律,value++計算出現(xiàn)次數(shù)
for (int i=0;i < questions.length;i++){
check10[questions[i]]++;
}
//出現(xiàn)最少與最多選項的次數(shù)初始化為A的次數(shù)
int low = check10[1];
int longer = check10[1];
//出現(xiàn)最少的選項谢肾,初始化為A
int lowA = 1;
//最少與最多次數(shù)的選項相關(guān)計算
for (int i=1;i<5;i++) {
if(check10[i] >0 && check10[i] < low){
low = check10[i];
lowA = i;
}
if (check10[i] > longer){
longer = check10[i];
}
}
//第7題,在此十道題中小泉,被選中次數(shù)最少的選項字母為
switch (questions[6]){
case 1:
//判斷才出現(xiàn)最少的字母是否為C
if (lowA != 3)
return false;
break;
case 2:
//原理同上
if (lowA != 2)
return false;
break;
case 3:
//原理同上
if (lowA != 1)
return false;
break;
case 4:
//原理同上
if (lowA != 4)
return false;
break;
}
//第10題芦疏,在此10道題中,ABCD四個字母出現(xiàn)次數(shù)最多與最少者的差為
//最多次數(shù)與最少次數(shù)的差值
int t = longer-low;
switch (questions[9]){
case 1:
//判斷差值是否為3
if (t != 3)
return false;
break;
case 2:
//原理同上
if (t != 2)
return false;
break;
case 3:
//原理同上
if (t != 4)
return false;
break;
case 4:
//原理同上
if (t != 1)
return false;
break;
}
//第7微姊、10 題校驗end
//第8題酸茴,以下選項中哪一題的答案與第1題的答案在字母中不相鄰
switch (questions[7]) {
case 1:
//判斷第7題與第一題答案差值絕對是是否為1
if (Math.abs(questions[6] - questions[0]) == 1)
return false;
break;
case 2:
//原理同上
if (Math.abs(questions[4] - questions[0]) == 1)
return false;
break;
case 3:
//原理同上
if (Math.abs(questions[1] - questions[0]) == 1)
return false;
break;
case 4:
//原理同上
if (Math.abs(questions[9] - questions[0]) == 1)
return false;
break;
}
//第9題,已知“第1題與第6題的答案相同”與“第X題與第5題的答案相同”的真假性相反兢交,那么X為
//判斷第1題與第6題的答案是否相同
boolean isOne = questions[0]==questions[5]?true:false;
switch (questions[8]){
case 1:
if(isOne){
//第1題與第6題相同薪捍,第6題與第5題答案相同返回false;
if (questions[5] == questions[4])
return false;
}else {
//第1題與第6題不相同配喳,第6題與第5題答案不相同返回false酪穿;
if (questions[5] != questions[4])
return false;
}
break;
case 2:
//原理同上
if(isOne){
if (questions[9] == questions[4])
return false;
}else {
if (questions[9] != questions[4])
return false;
}
break;
case 3:
//原理同上
if(isOne){
if (questions[1] == questions[4])
return false;
}else {
if (questions[1] != questions[4])
return false;
}
break;
case 4:
//原理同上
if(isOne){
if (questions[8] == questions[4])
return false;
}else {
if (questions[8] != questions[4])
return false;
}
break;
}
return true;
}
public static void main(String[] args) {
answer();
}
運行結(jié)果:
1:2
2:3
3:1
4:3
5:1
6:3
7:4
8:1
9:2
10:1
轉(zhuǎn)化成答案是:
B、C晴裹、A被济、C、A
C涧团、D只磷、A经磅、B、A