据说这是今年的侦探题,不过是好早的了,当时写出来没有开博客,今天发出来吧。思路就是用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 mainString[] args) {dfs1);}//dfs函数暴力填充sz,摸拟每道题的选项static void dfsint i){ifi==11){print);return;}//如果到了第11个,就调用print函数判断forint j=1;j<=4;j++){sz[i]=j;k[j]++;dfsi+1);k[j]–;}}static void print){//判断每道题是否正确,如果不对直接返回ifsz[2]==1){ifsz[5]!=3)return;}else ifsz[2]==2){ifsz[5]!=4)return;}else ifsz[2]==3){ifsz[5]!=1)return;}else ifsz[2]==4){ifsz[5]!=2)return;}ifsz[3]==1){ifsz[3]==sz[6]||sz[3]==sz[2]||sz[3]==sz[4]){return;}}else ifsz[3]==2){ifsz[3]==sz[6]||sz[6]==sz[2]||sz[6]==sz[4]){return;}}else ifsz[3]==3){ifsz[2]==sz[6]||sz[3]==sz[2]||sz[2]==sz[4]){return;}}else ifsz[3]==4){ifsz[4]==sz[6]||sz[4]==sz[2]||sz[3]==sz[4]){return;}}ifsz[4]==1){ifsz[1]!=sz[5]){return;}}ifsz[4]==2){ifsz[2]!=sz[7]){return;}}ifsz[4]==3){ifsz[1]!=sz[9]){return;}}ifsz[4]==4){ifsz[6]!=sz[10]){return;}}ifsz[5]==1){ifsz[8]!=sz[5]){return;}}ifsz[5]==2){ifsz[4]!=sz[5]){return;}}ifsz[5]==3){ifsz[9]!=sz[5]){return;}}ifsz[5]==4){ifsz[7]!=sz[5]){return;}}ifsz[6]==1){ifsz[8]!=sz[2]||sz[8]!=sz[4]){return;}}ifsz[6]==2){ifsz[8]!=sz[1]||sz[8]!=sz[6]){return;}}ifsz[6]==3){ifsz[8]!=sz[3]||sz[8]!=sz[10]){return;}}ifsz[6]==4){ifsz[8]!=sz[5]||sz[8]!=sz[9]){return;}}int i=1,j=2;int min1=k[1],min2=k[2];ifk[2]<k[1]){min1^=min2;min2^=min1;min1^=min2;i=2;j=1;}ifk[3]<min1){min2=min1;min1=k[3];j=i;i=3;}else ifk[3]<min2){min2=k[3];j=3;}ifk[4]<min1){min2=min1;min1=k[4];j=i;i=4;}else ifk[4]<min2){min2=k[4];j=4;}ifk[i]==k[j])return;ifsz[7]==1){ifi!=3){return;}}ifsz[7]==2){ifi!=2){return;}}ifsz[7]==3){ifi!=1){return;}}ifsz[7]==4){ifi!=4){return;}}//System.out.println7);ifsz[8]==1){ifMath.abssz[7]-sz[1])==1||Math.abssz[5]-sz[1])!=1||Math.abssz[2]-sz[1])!=1||Math.abssz[10]-sz[1])!=1){return;}}ifsz[8]==2){ifMath.abssz[7]-sz[1])!=1||Math.abssz[5]-sz[1])==1||Math.abssz[2]-sz[1])!=1||Math.abssz[10]-sz[1])!=1){return;}}ifsz[8]==3){ifMath.abssz[7]-sz[1])!=1||Math.abssz[5]-sz[1])!=1||Math.abssz[2]-sz[1])==1||Math.abssz[10]-sz[1])!=1){return;}}ifsz[8]==4){ifMath.abssz[7]-sz[1])!=1||Math.abssz[5]-sz[1])!=1||Math.abssz[2]-sz[1])!=1||Math.abssz[10]-sz[1])==1){return;}}ifsz[9]==1){ifsz[1]==sz[6]&&sz[5]==sz[6]){return;}}ifsz[9]==2){ifsz[1]==sz[6]&&sz[5]==sz[10]){return;}}ifsz[9]==3){ifsz[1]==sz[6]&&sz[5]==sz[2]){return;}}ifsz[9]==4){ifsz[1]==sz[6]&&sz[5]==sz[9]){return;}}int max=k[1];forint l=2;l<=4;l++){max=Math.maxmax, k[l]);}ifsz[10]==1){ifmax-min1!=3){return;}}ifsz[10]==2){ifmax-min1!=2){return;}}ifsz[10]==3){ifmax-min1!=4){return;}}ifsz[10]==4){ifmax-min1!=1){return;}}//如果到最后还没有出错,就打印出来。forint ii=1;ii<=10;ii++){char a=char) sz[ii]+’A’-1);System.out.printii+””+a+” “);}System.out.println);}}