您的位置:首页 > 编程语言 > Java开发

刑侦推理试卷答案【code by JAVA】

2018-03-08 09:47 429 查看


最近网上疯传的一张‘刑侦科推理试卷’让不少小伙伴对自己的智商产生怀疑。当看到这张试卷时,想必大家都兴奋的跃跃欲试,我在尝试了半小时后,写了一大堆草稿,脑袋已成浆糊。不过作为程序猿,自然有独特的打开方式,人脑处理不了,咱们用电脑。10道题4个待选项,用穷举的话最不济运算4^10次,也就100万出头,对于计算机来说小case。以下是代码
import java.util.ArrayList;
import java.util.Collections;
/**
* Created by Huberry on 2018/3/5.
*/
public class Test {
public static void main(String[] args){
exhaustion();
}
private static char[] aList = {'A', 'B', 'C', 'D'};
private static void exhaustion(){
int checkCount = 0;
for(char a1 : aList){
for(char a2 : aList){
for(char a3 : aList){
for(char a4 : aList){
for(char a5 : aList){
for(char a6 : aList){
for(char a7 : aList){
for(char a8 : aList){
for(char a9 : aList){
for(char a10 : aList){
ArrayList<Character> answers = new ArrayList<>();
answers.add(a1);
answers.add(a2);
answers.add(a3);
answers.add(a4);
answers.add(a5);
answers.add(a6);
answers.add(a7);
answers.add(a8);
answers.add(a9);
answers.add(a10);

checkCount++;
if(check(answers)){
System.out.println("checkCount_"+checkCount);
return;
}
}
}
}
}
}
}
}
}
}
}
}
private static boolean check(ArrayList<Character> answers){
char a1 = answers.get(0);
char a2 = answers.get(1);
char a3 = answers.get(2);
char a4 = answers.get(3);
char a5 = answers.get(4);
char a6 = answers.get(5);
char a7 = answers.get(6);
char a8 = answers.get(7);
char a9 = answers.get(8);
char a10 = answers.get(9);

// 第三题 哪个与其他三个不同 3 6 2 4
switch (a3){
case 'A':
if(!(a3!=a6 && a3!=a2 && a3!=a4))
return false;
break;
case 'B':
if(!(a6!=a3 && a6!=a2 && a6!=a4))
return false;
break;
case 'C':
if(!(a2!=a6 && a2!=a3 && a2!=a4))
return false;
break;
case 'D':
if(!(a4!=a3 && a4!=a2 && a6!=a4))
return false;
break;
}

// 第四题 哪两题相同 15 27 19 6,10
switch (a4){
case 'A':
if(!(a1==a5 && a2!=a7 && a1!=a9 && a6!=a10))
return false;
break;
case 'B':
if(!(a1!=a5 && a2==a7 && a1!=a9 && a6!=a10))
return false;
break;
case 'C':
if(!(a1!=a5 && a2!=a7 && a1==a9 && a6!=a10))
return false;
break;
case 'D':
if(!(a1!=a5 && a2!=a7 && a1!=a9 && a6==a10))
return false;
break;
}

// 第五题 哪题与本题相同 8 4 9 7
switch (a5){
case 'A':
if(!(a5==a8 && a5!=a4 && a5!=a9 && a5!=a7))
return false;
break;
case 'B':
if(!(a5!=a8 && a5==a4 && a5!=a9 && a5!=a7))
return false;
break;
case 'C':
if(!(a5!=a8 && a5!=a4 && a5==a9 && a5!=a7))
return false;
break;
case 'D':
if(!(a5!=a8 && a5!=a4 && a5!=a9 && a5==a7))
return false;
break;
}

// 第六题 哪两题与第八题相同 24 16 3,10 59
switch (a6){
case 'A':
if(!((a8==a2 && a8==a4) && (a8!=a1 || a8!=a6) && (a8!=a3 || a8!=a10) && (a8!=a5 || a8!=a9)))
return false;
break;
case 'B':
if(!((a8!=a2 || a8!=a4) && (a8==a1 && a8==a6) && (a8!=a3 || a8!=a10) && (a8!=a5 || a8!=a9)))
return false;
break;
case 'C':
if(!((a8!=a2 || a8!=a4) && (a8!=a1 || a8!=a6) && (a8==a3 && a8==a10) && (a8!=a5 || a8!=a9)))
return false;
break;
case 'D':
if(!((a8!=a2 || a8!=a4) && (a8!=a1 || a8!=a6) && (a8!=a3 || a8!=a10) && (a8==a5 && a8==a9)))
return false;
break;
}

int countA = Collections.frequency(answers, 'A');
int countB = Collections.frequency(answers, 'B');
int countC = Collections.frequency(answers, 'C');
int countD = Collections.frequency(answers, 'D');
ArrayList<Integer> counts = new ArrayList<>();
counts.add(countA);
counts.add(countB);
counts.add(countC);
counts.add(countD);
int countMin = Collections.min(counts);
int countMax = Collections.max(counts);

// 第七题 被选中最少的 C B A D
switch (a7){
case 'A':
if(!(countC == countMin))
return false;
break;
case 'B':
if(!(countB == countMin))
return false;
break;
case 'C':
if(!(countA == countMin))
return false;
break;
case 'D':
if(!(countD == countMin))
return false;
break;
}

// 第八题 哪一题与第一题不相邻 7 5 2 10
int asc1 = (int)a1;
switch (a8){
case 'A':
if(!(Math.abs(asc1-(int)a7)!=1 && Math.abs(asc1-(int)a5)==1 && Math.abs(asc1-(int)a2)==1 && Math.abs(asc1-(int)a10)==1))
return false;
break;
case 'B':
if(!(Math.abs(asc1-(int)a7)==1 && Math.abs(asc1-(int)a5)!=1 && Math.abs(asc1-(int)a2)==1 && Math.abs(asc1-(int)a10)==1))
return false;
break;
case 'C':
if(!(Math.abs(asc1-(int)a7)==1 && Math.abs(asc1-(int)a5)==1 && Math.abs(asc1-(int)a2)!=1 &&a
a37e
mp; Math.abs(asc1-(int)a10)==1))
return false;
break;
case 'D':
if(!(Math.abs(asc1-(int)a7)==1 && Math.abs(asc1-(int)a5)==1 && Math.abs(asc1-(int)a2)==1 && Math.abs(asc1-(int)a10)!=1))
return false;
break;
}

// 第9题 1=6和x=5真假相反 6 10 2 9
boolean same1_6 = a1==a6;
switch (a9){
case 'A':
if(!((same1_6 != (a5==a6)) && (same1_6 == (a5==a10)) && (same1_6 == (a5==a2)) && (same1_6 == (a5==a9))))
return false;
break;
case 'B':
if(!((same1_6 == (a5==a6)) && (same1_6 != (a5==a10)) && (same1_6 == (a5==a2)) && (same1_6 == (a5==a9))))
return false;
break;
case 'C':
if(!((same1_6 == (a5==a6)) && (same1_6 == (a5==a10)) && (same1_6 != (a5==a2)) && (same1_6 == (a5==a9))))
return false;
break;
case 'D':
if(!((same1_6 == (a5==a6)) && (same1_6 == (a5==a10)) && (same1_6 == (a5==a2)) && (same1_6 != (a5==a9))))
return false;
break;
}

// 第十题 答案出现最多的和最少的差值 3 2 4 1
switch (a10){
case 'A':
if(!(countMax-countMin == 3))
return false;
break;
case 'B':
if(!(countMax-countMin == 2))
return false;
break;
case 'C':
if(!(countMax-countMin == 4))
return false;
break;
case 'D':
if(!(countMax-countMin == 1))
return false;
break;
}
System.out.println("1"+a1+ "_2"+a2+ "_3"+a3+ "_4"+a4+ "_5"+a5+ "_6"+a6+ "_7"+a7+ "_8"+a8+ "_9"+a9+ "_10"+a10);
return true;
}
}

运行结果:


可见试了40W次出来正确答案
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息