2018侦探推理题

据说这是今年的侦探题,不过是好早的了,当时写出来没有开博客,今天发出来吧。思路就是用dfs暴力枚举每道题的答案,然后很多if判断答案是否正确,代码还是有一些赘余。是用JAVA写的。

说一下复杂度问题,因为是4个选项,复杂度是4^10,2^20;大概就是1000^2=1e6;加上大量的判断,也不过是1e7。这个复杂度并不算太高,所以暴力枚举是行得通的。

public class For {
static int sz[]=new int[11];//储存每一个题目的选项
static int k[]=new int[5];//粗存每个选项的个数
	public static void main(String[] args) {
	dfs(1);
	}
	//dfs函数暴力填充sz,摸拟每道题的选项
	static void dfs(int i){
		if(i==11){print();return;}//如果到了第11个,就调用print函数判断
		for(int j=1;j<=4;j++){
			sz[i]=j;
			k[j]++;
			dfs(i+1);
			k[j]--;
		}
	}
	static void print(){
		//判断每道题是否正确,如果不对直接返回
		if(sz[2]==1){if(sz[5]!=3)return;}
		else if(sz[2]==2){if(sz[5]!=4)return;}
		else if(sz[2]==3){if(sz[5]!=1)return;}
		else if(sz[2]==4){if(sz[5]!=2)return;}
		
		if(sz[3]==1){if(sz[3]==sz[6]||sz[3]==sz[2]||sz[3]==sz[4]){return;}}
		else if(sz[3]==2){if(sz[3]==sz[6]||sz[6]==sz[2]||sz[6]==sz[4]){return;}}
		else if(sz[3]==3){if(sz[2]==sz[6]||sz[3]==sz[2]||sz[2]==sz[4]){return;}}
		else if(sz[3]==4){if(sz[4]==sz[6]||sz[4]==sz[2]||sz[3]==sz[4]){return;}}
		
		if(sz[4]==1){if(sz[1]!=sz[5]){return;}}
		if(sz[4]==2){if(sz[2]!=sz[7]){return;}}
		if(sz[4]==3){if(sz[1]!=sz[9]){return;}}
		if(sz[4]==4){if(sz[6]!=sz[10]){return;}}

		if(sz[5]==1){if(sz[8]!=sz[5]){return;}}
		if(sz[5]==2){if(sz[4]!=sz[5]){return;}}
		if(sz[5]==3){if(sz[9]!=sz[5]){return;}}
		if(sz[5]==4){if(sz[7]!=sz[5]){return;}}

		if(sz[6]==1){if(sz[8]!=sz[2]||sz[8]!=sz[4]){return;}}
		if(sz[6]==2){if(sz[8]!=sz[1]||sz[8]!=sz[6]){return;}}
		if(sz[6]==3){if(sz[8]!=sz[3]||sz[8]!=sz[10]){return;}}
		if(sz[6]==4){if(sz[8]!=sz[5]||sz[8]!=sz[9]){return;}}

		int i=1,j=2;
		int min1=k[1],min2=k[2];if(k[2]<k[1]){min1^=min2;min2^=min1;min1^=min2;i=2;j=1;}
		if(k[3]<min1){min2=min1;min1=k[3];j=i;i=3;}else if(k[3]<min2){min2=k[3];j=3;}
		if(k[4]<min1){min2=min1;min1=k[4];j=i;i=4;}else if(k[4]<min2){min2=k[4];j=4;}
		if(k[i]==k[j])return;
		if(sz[7]==1){if(i!=3){return;}}
		if(sz[7]==2){if(i!=2){return;}}
		if(sz[7]==3){if(i!=1){return;}}
		if(sz[7]==4){if(i!=4){return;}}
		//System.out.println(7);
		if(sz[8]==1){if(Math.abs(sz[7]-sz[1])==1||Math.abs(sz[5]-sz[1])!=1
				||Math.abs(sz[2]-sz[1])!=1||Math.abs(sz[10]-sz[1])!=1){return;}}
		if(sz[8]==2){if(Math.abs(sz[7]-sz[1])!=1||Math.abs(sz[5]-sz[1])==1
				||Math.abs(sz[2]-sz[1])!=1||Math.abs(sz[10]-sz[1])!=1){return;}}
		if(sz[8]==3){if(Math.abs(sz[7]-sz[1])!=1||Math.abs(sz[5]-sz[1])!=1
				||Math.abs(sz[2]-sz[1])==1||Math.abs(sz[10]-sz[1])!=1){return;}}
		if(sz[8]==4){if(Math.abs(sz[7]-sz[1])!=1||Math.abs(sz[5]-sz[1])!=1
				||Math.abs(sz[2]-sz[1])!=1||Math.abs(sz[10]-sz[1])==1){return;}}

		if(sz[9]==1){if(sz[1]==sz[6]&&sz[5]==sz[6]){return;}}
		if(sz[9]==2){if(sz[1]==sz[6]&&sz[5]==sz[10]){return;}}
		if(sz[9]==3){if(sz[1]==sz[6]&&sz[5]==sz[2]){return;}}
		if(sz[9]==4){if(sz[1]==sz[6]&&sz[5]==sz[9]){return;}}

		int max=k[1];for(int l=2;l<=4;l++){max=Math.max(max, k[l]);}
		if(sz[10]==1){if(max-min1!=3){return;}}
		if(sz[10]==2){if(max-min1!=2){return;}}
		if(sz[10]==3){if(max-min1!=4){return;}}
		if(sz[10]==4){if(max-min1!=1){return;}}
		//如果到最后还没有出错,就打印出来。
		for(int ii=1;ii<=10;ii++){char a=(char) (sz[ii]+'A'-1);System.out.print(ii+""+a+" ");}
		System.out.println();
		}
}

猜你喜欢

转载自blog.csdn.net/king8611/article/details/81006274