前几天看到同学在微博分享了一页逻辑题,大概是这样的:
粗略看了一下,确实费脑筋。年纪大了本不想动脑子,可今天突发奇想,干脆用电脑暴力破解吧!
这种题如果动脑子想,首先是个费时间的活儿,一般这类题是没有特别明显的突破口的,总是或多或少的需要人脑去试错,不但考验逻辑推理,记忆力不行还会崩溃。既然如此,干脆穷举试错,这道题一共4^10=1048576种答案,反正cpu不会缺氧(图灵破解英格玛是个啥感觉!)。
打开eclipse,突然有点小迷茫。本想用数组的方式,先将这1048576种答案列好,然后用4进制的形式表达。先不说之后怎么试错,光转换4进制就难住我了。思索了15分钟,索性直接用了10个for。。。
接下来开始按照题目(a0-a9代表1-10题的答案,0-3代表abcd)编辑各种套娃式的if语句,第一题写出来等于废话,略过;从第2题开始到第6题及其顺畅,非常明显的“或且非”,5分钟搞定,而且没完成一个答案个数都是指数型递减;第7题感觉略显复杂,没关系,不爱动脑就用笨方法,函数式编程,花5分钟做函数,搞定。
此时再一次测试,发现当初那100多万个答案只剩下两个了:
代表BCACACDABA和DCACACBADA(从0开始数数!)。随后发现还没有编进去的8、9、10题中8、10题答案是一样的,外加没有写进去的第1题,发现这套题实际有用条件只有2、3、4、5、6、7、9几个。看看时间不早,还有电视剧要赶,于是取巧只把第9题写了进去,得到最终答案BCACACDABA。
最后附上代码,呵呵。。。
public class Main {
public static int question7(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9)
{
int[] a=new int[10];
a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;a[8]=a8;a[9]=a9;
int count0=0;int count1=0;int count2=0;int count3=0;
for(int i=0;i<10;i++)
{
if(a[i]==0)
count0++;
if(a[i]==1)
count1++;
if(a[i]==2)
count2++;
if(a[i]==3)
count3++;
}
if(count0<=count1&&count0<=count2&&count0<=count3)
return 0;
if(count1<=count0&&count1<=count2&&count1<=count3)
return 1;
if(count2<=count0&&count2<=count1&&count2<=count3)
return 2;
if(count3<=count0&&count3<=count1&&count3<=count2)
return 3;
return 0;
}
public static void main(String[] args) {
int a0;int a1;int a2;int a3;int a4;int a5;int a6;int a7;int a8;int a9;
for(a0=0;a0<4;a0++)
{
for(a1=0;a1<4;a1++)
{
for(a2=0;a2<4;a2++)
{
for(a3=0;a3<4;a3++)
{
for(a4=0;a4<4;a4++)
{
for(a5=0;a5<4;a5++)
{
for(a6=0;a6<4;a6++)
{
for(a7=0;a7<4;a7++)
{
for(a8=0;a8<4;a8++)
{
for(a9=0;a9<4;a9++)
{
if((a1==0&&a4==2)||(a1==1&&a4==3)||(a1==2&&a4==0)||(a1==3&&a4==1))//2
{
if((a2==a5&&a5==a1&&a3!=a2&&a2==3)||(a2==a5&&a5!=a1&&a3==a2&&a2==2)||(a2!=a5&&a5==a1&&a3==a1&&a2==0)||(a2!=a5&&a2==a1&&a3==a2&&a2==1))//3
{
if((a3==0&&a0==a4)||(a3==1&&a1==a6)||(a3==2&&a0==a8)||(a3==3&&a5==a9))//4
{
if((a4==0&&a7==a4)||(a4==1&&a3==a4)||(a4==2&&a4==a8)||(a4==3&&a4==a6))//5
{
if((a5==0&&a7==a1&&a7==a3)||(a5==1&&a7==a0&&a7==a5)||(a5==2&&a7==a2&&a7==a9)||(a5==3&&a7==a4&&a7==a8))//6
{
if((a6==0&&question7(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)==2)||(a6==1&&question7(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)==1)||(a6==2&&question7(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)==0)||(a6==3&&question7(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)==3))//7
{
if((a8==0&&((!(a0==a5))==(a4==a5)))||(a8==1&&((!(a0==a5))==(a4==a9)))||(a8==2&&((!(a0==a5))==(a4==a1)))||(a8==3&&((!(a0==a5))==(a4==a8))))//9
System.out.println(a0+""+a1+""+a2+""+a3+""+a4+""+a5+""+a6+""+a7+""+a8+""+a9);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}