运用ArrayList实现逻辑推理题(谁养鱼)
1.穷举法
穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。
2.谁养鱼
用笔穷举的速度非常慢,《谁养鱼》是爱因斯坦在20世纪初出的谜语,他说世界上有百分之98的人答不出来。你能答出来吗?
这道逻辑性很强的题是:
1)在一条街上有5座房子,喷了5种颜色。
2)每个房子里住着不同国籍的人.
3)每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。
问题是:谁养的是鱼?
所列举项应该满足如下15个要求:
- 英国人住红色房子;
- 瑞典人养狗;
- 丹麦人喝茶;
- 绿色房子在白色房子左边;
- 绿色房子主人喝咖啡;
- 抽PalMal香烟的人养鸟;
- 黄色房子主人抽Dunhill香烟;
- 住在中间房子的人喝牛奶;
- 挪威人住第一间房;
- 抽Blends香烟的人住在养猫的人隔壁;
- 养马的人住抽Dunhill香烟的人隔壁;
- 抽BlMt的人喝啤酒;
- 德国人抽Prince香烟;
- 挪威人住蓝色房子隔壁;
- 抽Blends香烟的人有一个喝水的邻居。
3.原理
- Init()方法中创建ArrayList列表集合,运用多种循环进行判断获得各组数据之间的组合方式,并将符合要求的组合方式放入列表集合中。循环遍历列表集合,将元素放入颜色、人员、饮料等数组中。
- calculate()方法调用init()方法对数组元素进行初始化。循环判断比较各数组元素的关系获得符合原题要求的元素的索引,再根据 show()方法循环将指定素引的元素打印到控制台。
4.语法
- ArrayList是List接口的一个可变长数组实现,实现了所有List接口的操作,并允许存储空(null)值。除没有进行同步,ArrayList基本等同于Vector。在Vectors中几乎对所有的方法都进行同步,但ArrayList仅对writeObject()和readObject()进行同步。其他如add()、remove()等都没有同步。
- ArrayList实现了Java.io.Serializable接口,所以ArrayList对象可以序列化到持久存储介质中。
- 实例化一个ArrayList对象时,可以指定一个初始容量,默认的容量为10。当元素超过ArrayList对象的初始大小时,容器容量大小増加原来的50%。
5.代码
主程序:
public static void main(String args[]) {
//Java程序主入口
rw33 test=new rw33();//实例化对象
long l=System.currentTimeMillis();//获得系统时间
test.calculate();//调用的方法进行计算统计
System.out.println("计算共用时:"+(System.currentTimeMillis()-l)+"ms");//获得计算所花费的时间
}
计算一组数据的组合方式:
public void init() {
//计算一组数据的组合方式
ArrayList array=new ArrayList();//创建集合数组
for(int num1=0;num1<5;num1++) {
for(int num2=0;num2<5;num2++) {
if(num2==num1)
continue;
for(int num3=0;num3<5;num3++) {
if(num3 ==num2||num3==num1)
continue;
for(int num4 =0;num4<5;num4++) {
if(num4==num3||num4==num2||num4==num1)
continue;
for (int num5=0;num5<5;num5++) {
if(num5==num4||num5==num3||num5==num2||num5==num1)
continue;
int oneArray[]= {
num1,num2,num3,num4,num5};
array.add(oneArray);
}
}
}
}
}
color=new int[array.size()][5];//创建颜色的二维数组
for(int count=0;count<array.size();count++) {
//循环数组时初始化房子颜色数据
color[count]=(int[])array.get(count);
}
person=color;
drink=color;
smoke=color;
pet = color;
}
判断运算:
public void calculate() {
//判断运算
init();//调用方法时初始化数据
for(int num1=0;num1<color.length;num1++) {
if(!con4(num1))
c