爱因斯坦问题

来源:互联网 发布:瞻博网络官网 编辑:程序博客网 时间:2024/04/29 16:09

问题描述:

1 有五栋五种颜色的房子   
2 每一位房子的主人国籍都不同   
3 这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物   
4 没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料   
条件:   
1 英国人住在红房子里   
2 瑞典人养了一条狗   
3 丹麦人喝茶   
4 绿房子在白房子左边   
5 绿房子主人喝咖啡   
6 抽PALL MALL烟的人养了一只鸟   
7 黄房子主人抽DUNHILL烟   
8 住在中间那间房子的人喝牛奶   
9 挪威人住第一间房子   
10 抽BLENDS烟的人住在养猫人的旁边   
11 养马人住在DUNHILL烟的人旁边   
12 抽BLUE MASTER烟的人喝啤酒   
13 德国人抽PRINCE烟   
14 挪威人住在蓝房子旁边   
15 抽BLENDS烟的人的邻居喝矿泉水   
问题:谁养鱼?   

解决方法:

首先给color,person,drink,smoke,pet数组赋初始值,初始值为下标值0-4,下标对应相应的值,每个数组有5!组值,例如对color组来说,一共有color[0][]-color[119][]组值,每个数组的第一个下标对应一组值(例如color数组:{"红房子","绿房子","白房子","黄房子","蓝房子"}或者{"绿房子","白房子","红房子","黄房子","蓝房子"}或者其他的值),第二个下标对应的是取colors数组中的哪个值,如果为color[][i]==1则对应这组值,第二个元素为绿房子。通过这样给每个数组赋初始值,然后通过以下方式进行比较,例如:对于英国人住在红房子里,英国人可以这样表示person[p][i]==0,红房子可以这样表示color[c][i]==0,p,c代表是各自数组的第几组值,i是代表数组值得第几个,如果此时person[p][i]==0(英国人 )&&color[c][i]==0 (红房子),则此时可以取各自数组的这组值。另外的条件也都可以这样判断,如果得到一个person[p][i],color[c][i],drink[d][i],smoke[s][i],pet[k][i]都满足要求(注意每组值都是i,即数组的第二个下标是相同的),此时这个结果是满足要求的。

package practice;



import java.util.ArrayList;


public class fish 
{
public static String []colors={"红房子","绿房子","白房子","黄房子","蓝房子"};
public static String []persons={"英国人","瑞典人","丹麦人","挪威人","德国人"};
public static String []drinks={"茶","咖啡","牛奶","水","啤酒"};
public static String []smokes={"pall","dunh","blen","blue","prin"};
public static String []pets={"狗","鸟","猫","马","鱼"};

ArrayList arr=new ArrayList();
int color[][];
int person[][];
int drink[][];
int smoke[][];
int pet[][];
int total;

public  void init()
{
for(int num1=0;num1<5;num1++)
{
for(int num2=0;num2<5;num2++)
{
if(num1==num2)
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 a[]={num1,num2,num3,num4,num5};
arr.add(a);
}
}
}
}
}
color=new int[arr.size()][5];
for(int count=0;count<arr.size();count++)
color[count]=(int [])arr.get(count);
person=color;
drink=color;
smoke=color;
pet=color;
}

public void show(int n1,int n2,int n3,int n4,int n5)
{
System.out.println("第"+total+"组");
System.out.println("1\t2\t3\t4\t5");
for(int i=0;i<5;i++)
System.out.print(colors[color[n1][i]]+"\t");
System.out.println();
for(int i=0;i<5;i++)
System.out.print(persons[person[n2][i]]+"\t");
System.out.println();
for(int i=0;i<5;i++)
System.out.print(drinks[drink[n3][i]]+"\t");
System.out.println();
for(int i=0;i<5;i++)
System.out.print(smokes[smoke[n4][i]]+"\t");
System.out.println();
for(int i=0;i<5;i++)
System.out.print(pets[pet[n5][i]]+"\t");
System.out.println();
}

public void process()
{
init();
total=0;
for(int num1=0;num1<color.length;num1++)
{
if(!iden4(num1))
continue;
for(int num2=0;num2<person.length;num2++)
{
if(!iden1(num2,num1))
continue;
if(!iden9(num2))
continue;
if(!iden14(num2,num1))
continue;
for(int num3=0;num3<drink.length;num3++)
{
if(!iden3(num2,num3))
continue;
if(!iden5(num1,num3))
continue;
if(!iden8(num3))
continue;
for(int num4=0;num4<smoke.length;num4++)
{
if(!iden7(num1,num4))
continue;
if(!iden12(num4,num3))
continue;
if(!iden13(num2,num4))
continue;
if(!iden15(num3,num4))
continue;
for(int num5=0;num5<pet.length;num5++)
{
if(!iden2(num2,num5))
continue;
if(iden6(num4,num5))
continue;
if(!iden10(num4,num5))
continue;
if(!iden11(num4,num5))
continue;
show(num1,num2,num3,num4,num5);
total++;
}
}
}
}
}
}


public boolean iden1(int p,int c)
{
for(int i=0;i<5;i++)
{
if(person[p][i]==0)
{
if(color[c][i]==0)
return true;
else
break;
}
}
return false;
}

public boolean iden2(int p,int pe)
{
for(int i=0;i<5;i++)
{
if(person[p][i]==1)
{
if(pet[pe][i]==0)
return true;
else
break;
}
}
return false;
}

public boolean iden3(int p,int d)
{
for(int i=0;i<5;i++)
{
if(person[p][i]==2)
{
if(drink[d][i]==0)
return true;
else
break;
}
}
return false;
}

public boolean iden4(int c)
{
int co1=0;
int co2=0;
for(int i=0;i<5;i++)
{
if(color[c][i]==1)
co1=i;
if(color[c][i]==2)
co2=i;
}
if(co2>co1)
return true;
else
return false;
}

public boolean iden5(int c,int d)
{
for(int i=0;i<5;i++)
{
if(color[c][i]==1)
{
if(drink[d][i]==1)
return true;
else
break;
}
}
return false;
}

public boolean iden6(int s,int pe)
{
for(int i=0;i<5;i++)
{
if(smoke[s][i]==0)
{
if(pet[pe][i]==1)
return true;
else
break;
}
}
return false;
}

public boolean iden7(int c,int s)
{
for(int i=0;i<5;i++)
{
if(color[c][i]==3)
{
if(smoke[s][i]==1)
return true;
else
break;
}
}
return false;
}

public boolean iden8(int d)
{
if(drink[d][2]==2)
return true;
else
return false;
}

public boolean iden9(int p)
{
if(person[p][0]==3)
return true;
else
return false;
}

public boolean iden10(int s,int pe)
{
int cp=0;
int cs=0;
for(int i=0;i<5;i++)
{
if(smoke[s][i]==2)
cs=i;
if(pet[pe][i]==2)
cp=i;
}
int r=cp-cs;
if(Math.abs(r)==1) 
return true;
else
return false;
}

public boolean iden11(int s,int pe)
{
int cp=0;
int cs=0;
for(int i=0;i<5;i++)
{
if(smoke[s][i]==1)
cs=i;
if(pet[pe][i]==3)
cp=i;
}
int r=cp-cs;
if(Math.abs(r)==1) 
return true;
else
return false;
}

public boolean iden12(int s,int d)
{
for(int i=0;i<5;i++)
{
if(smoke[s][i]==3)
{
if(drink[d][i]==4)
return true;
else
break;
}
}
return false;
}

public boolean iden13(int p,int s)
{
for(int i=0;i<5;i++)
{
if(person[p][i]==4)
{
if(smoke[s][i]==4)
return true;
else
break;
}
}
return false;
}

public boolean iden14(int p,int c)
{



int cp=0;
int cs=0;
for(int i=0;i<5;i++)
{
if(person[p][i]==3)
cs=i;
if(color[c][i]==4)
cp=i;
}
int r=cp-cs;
if(Math.abs(r)==1) 
return true;
else
return false;
}

public boolean iden15(int d,int s)
{
int cp=0;
int cs=0;
for(int i=0;i<5;i++)
{
if(drink[d][i]==3)
cs=i;
if(smoke[s][i]==2)
cp=i;
}
int r=cp-cs;
if(Math.abs(r)==1) 
return true;
else
return false;
}

public static void main(String[] args) 
{
fish f=new fish();
f.process();
}


}
0 0
原创粉丝点击