2018年刑侦科推理试题


看到知乎上有人用VB求出了解,自己用Java试了一下...  

思路:穷举法。生成所有可能的答案组合(共1<<20种组合),将2-10题目作为筛选条件(第1题没有信息量)。

代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Reasoning {
	
	/**
	 * 生成数组
	 * @param set
	 */
	public static void generate(Set set){
		//1号位
		for (int b = 1; b < 5; b++) {
			//2
			for (int c = 1; c < 5; c++) {
				//3
				for (int d = 1; d < 5; d++) {
					//4
					for (int e = 1; e < 5; e++) {
						//5
						for (int f = 1; f < 5; f++) {
							//6
							for (int g = 1; g < 5; g++) {
								//7
								for (int h = 1; h < 5; h++) {
									//8
									for (int i = 1; i < 5; i++) {
										//9
										for (int j = 1; j < 5; j++) {
											//10
											for (int k = 1; k < 5; k++) {
												int[] a = new int[11];
												a[0] = 1;//判断是否符号条件标识位
													put(a,1,b);
													put(a,2,c);
													put(a,3,d);
													put(a,4,e);
													put(a,5,f);
													put(a,6,g);
													put(a,7,h);
													put(a,8,i);
													put(a,9,j);
													put(a,10,k);
												set.add(a);
											}
											
										}
									}
								}
							}
						}
					}
				}
				
			}
		}
	}
	
	/**
	 * 
	 * @param arr 数组
	 * @param y	  数组下标
	 * @param x	 数组的值(1、2、3、4 对应A、B、C、D)
	 */
	public static void put(int[] a,int y,int x){
		a[y] = x;
	}
	
	//第二题
	public static void second(int[] a){
		if(a[5] == 3 && a[2] == 1){}
		else if(a[5] == 4 && a[2] == 2){}
		else if(a[5] == 1 && a[2] == 3){}
		else if(a[5] == 2 && a[2] == 4){}
		else{
			a[0] = 0;
		}
	}
	
	//第三题
	public static void third(int[] a){
		if(a[2]==a[3] && a[3]==a[4] && a[3]!=a[6] && a[3] == 2){}//234答案相同
		else if(a[2]==a[3] && a[3]==a[6] && a[3]!=a[4] && a[3] == 4){}//236答案相同
		else if(a[2]==a[4] && a[4]==a[6] && a[4]!=1 && a[3] == 1){}//246答案相同
		else if(a[3]==a[4] && a[4]==a[6] && a[3]!=a[2] && a[3] == 3){}//346答案相同
		else{//不符合条件
			a[0] = 0;
		}
	}
	
	//第四题
	public static void fourth(int[] a){
		if(a[1] == a[5] && a[4] == 1){}
		else if(a[2] == a[7] && a[4] == 2){}
		else if(a[1] == a[9] && a[4] == 3){}
		else if(a[6] == a[10] && a[4] == 4){}
		else{
			a[0] = 0;
		}
	}
	
	//第五题
	public static void fifth(int[] a){
		if(a[5] == a[8] && a[5] == 1 ){}
		else if(a[5] == a[4] && a[5] == 2){}
		else if(a[5] == a[9] && a[5] == 3){}
		else if(a[5] == a[7] && a[5] == 4){}
		else{
			a[0] = 0;
		}
	}
	
	//第六题
	public static void sixth(int[] a){
		if(a[2] == a[8] && a[4] == a[8] && a[6] == 1 ){}
		else if(a[1] == a[8] && a[6] == a[8] && a[6] == 2){}
		else if(a[3] == a[8] && a[10] == a[8] && a[6] == 3){}
		else if(a[5] == a[8] && a[9] == a[8] && a[6] == 4){}
		else{
			a[0] = 0;
		}
	}
	
	//第七题 
	//这10题中被选中次数最少的
	public static void seventh(int[] a){
		int min = count(a, "min");
		if(min == 1 && a[7] == 3){}
		else if(min == 2 && a[7] == 2){}
		else if(min == 3 && a[7] == 1){}
		else if(min == 4 && a[7] == 4){}
		else{
			a[0] = 0;
		}
			
	}
	
	//第八题
	public static void eighth(int[] a){
		if(a[1]-1 != a[7] || a[1]+1 != a[7] && a[8] == 1){}
		else if(a[1]-1 != a[5] || a[1]+1 != a[5] && a[8] == 2){}
		else if(a[1]-1 != a[2] || a[1]+1 != a[2] && a[8] == 3){}
		else if(a[1]-1 != a[10] || a[1]+1 != a[10] && a[8] == 4){}
		else{
			a[0] = 0;
		}
	}
	
	//第九题
	public static void nineth(int[] a){
		if(a[1] == a[6]){
			if(a[6] != a[5] && a[9] == 1){}
			else if(a[10] != a[5] && a[9] == 2){}
			else if(a[2] != a[5] && a[9] == 3){}
			else if(a[9] != a[5] && a[9] == 4){}
			else{
				a[0] = 0;
			}
		}else{
			if(a[6] == a[5]  && a[9] == 1){}
			else if(a[10] == a[5]  && a[9] == 2){}
			else if(a[2] == a[5]  && a[9] == 3){}
			else if(a[9] == a[5]  && a[9] == 4){}
			else{
				a[0] = 0;
			}
		}
	}
	
	//第十题
	public static void tenth(int[] a){
		int sub = count(a, "sub");
		 if(sub == 3 && a[10] == 1){}
			else if(sub == 2 && a[10] == 2){}
			else if(sub == 4 && a[10] == 3){}
			else if(sub == 1 && a[10] == 4){}
			else{
				a[0] = 0;
			}
	}
	
	
	/**
	 * TODO:统计返回最大出现次数与最小出现次数的差,或返回出现次数最小的选项
	 * @param a 数组
	 * @param m "sub"返回次数差,否则返回出现次数最小的选项
	 * @return
	 */
	public static int count(int[] a,String m){
		int[] num = new int[5];
		for(int i=1; i<11; i++){
			if(a[i] == 1){
				num[1] ++;
			}
			else if(a[i] == 2){
				num[2]++;
			}
			else if(a[i] == 3){
				num[3]++;
			}
			else{
				num[4]++;
			}
		}
		int max = Math.max(num[1], 
					Math.max(num[2], 
						Math.max(num[3], num[4])));
		int min = Math.min(num[1], 
					Math.min(num[2], 
						Math.min(num[3], num[4])));
		if("sub".equals(m)){
			return max - min;
		}else{
			if(min == num[1]){
				return 1;
			}else if(min == num[2]){
				return 2;
			}else if(min == num[3]){
				return 3;
			}else{
				return 4;
			}
		}
		
	}
	
	public static void main(String[] args) {
		int num = 0;
		HashSet<int[]> set = new HashSet<int[]>();
		generate(set);
		for(int[] a : set){
			second(a);
			third(a);
			fourth(a);
			fifth(a);
			sixth(a);
			seventh(a);
			eighth(a);
			nineth(a);
			tenth(a);
			//输出符合条件的答案
			if(a[0] == 1){
				for(int j : a){
					System.out.print(j+",");
				}
				System.out.println();
			}
		}
	}
}

输出结果:

1,2,3,1,3,1,3,4,1,2,1,

对应答案:BCACACDABA



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值