|
/**原题为:五个房子,五种颜色,分别住着五个国籍的人,每人养的宠物不同,喝的饮料不同,抽的烟不同
*条件:1、英国人住红色房子;2、瑞典人养狗;3、丹麦人喝茶;4、绿色房子在白色房子左边;
*5、绿色房子主人和咖啡;6、抽Pail Mail香烟的人养鸟;7、黄色房子主人抽Dunhill香烟;
*8、住在中间房子的人和牛奶;9、挪威人住第一间房子;10、抽Blends香烟的人住在养猫的隔壁;
*11、养马的人住抽Dunhill香烟的隔壁;12、抽Blue Master的人喝啤酒;13、德国人抽Prince香烟;
*14、挪威人住蓝色房子隔壁;15、抽Blends香烟的人有一个喝水的邻居。问谁养鱼?
*解题的关键在于如何将这个问题化成数学问题:将五个房子分别编上序号(1、2、3、4、5),
然后求出颜色、国籍、宠物、香烟、饮料的各个具体数值*/
我曾用java语言编了个程序来解这道题
原程序如下:
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class EnstenFrame extends JFrame{
/**各个国籍的变量,求出它们的数值,就可以知道哪个房子住着那国人*/
protected static int nEnglish,nSweden,nDanmark,nGermany;
/**颜色变量,作用如上*/
protected static int cred,cgreen,cwhite,cyellow;
/**宠物变量,作用如上*/
protected static int pdog,pbird,pcat,phorse;
/**饮料变量,作用如上*/
protected static int dtea,dcoffee,dbeer,dwater;
/**香烟变量,作用如上*/
protected static int spail,sdunhill,sblends,sblue,sprince;
/**数组a[5][5]用来容纳答案*/
protected static String a[][] = new String[5][5];
protected JTextArea[][] jt ;
JPanel[] p ;
JButton jb ;
public EnstenFrame(){
super("爱因斯坦迷题");
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){System.err.println("找不到此种外观:"+e);}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jt = new JTextArea[5][5];
p = new JPanel[2];
p[0] = new JPanel();
p[1] = new JPanel();
for(int i = 0;i < 5;i++)
for(int j = 0;j < 5; j++){
jt[i][j] = new JTextArea();
jt[i][j].setEditable(false);
}
jb = new JButton("解题");
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
solution();
}
});
p[0].setLayout(new GridLayout(5,5,5,8));
for(int i = 0 ; i < 5; i++)
for (int j = 0; j < 5;j++)
p[0].add(jt[i][j]);
p[1].add(jb);
setLayout(new BorderLayout());
add(p[0],BorderLayout.CENTER);
add(p[1],BorderLayout.SOUTH);
setSize(400,300);
setResizable(false);
Dimension screen = getToolkit().getScreenSize();
setLocation((screen.width - getSize().width)/2,
(screen.height - getSize().height)/2);
setAlwaysOnTop(true);
setVisible(true);
}
public static void main(String[] args){
System.out.println("原题为:五个房子,五种颜色,分别住着五个国籍的人,每人养的宠物不同,喝的饮料不同,抽的烟不同");
System.out.println("条件为:1.英国人住红色房子\n"
+"2.瑞典人养狗\n"+"3.丹麦人喝茶\n"+"4.绿色房子在白色房子左边\n"
+"5.绿色房子主人喝咖啡\n"+"6.抽Pail Mail香烟的人养鸟\n"+"7.黄色房子主人抽Dunhill香烟\n"
+"8.住在中间房子的人喝牛奶\n"+"9.挪威人住第一间房子\n"
+"10.抽Blends香烟的人住在养猫的隔壁\n"+"11.养马的人住抽Dunhill香烟的隔壁\n"
+"12.抽Blue Master的人喝啤酒\n"+"13.德国人抽Prince香烟\n"
+"14.挪威人住蓝色房子隔壁\n"+"15.抽Blends香烟的人有一个喝水的邻居\n"
+"问谁养鱼?");
EnstenFrame n =new EnstenFrame();
}
public void solution(){
int n = 0;
int m = 0;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
a[i][j]="no";
}
for (nEnglish=3;nEnglish <6;nEnglish++){ //根据条件,挪威人住1号房,2号房为蓝色,住红色房子的英国人只能是住3号以后的房子
cred=nEnglish;
for(nSweden=2;nSweden<6;nSweden++){
if (nSweden == nEnglish)//排除挪威人和英国人的住房
continue;
else {
pdog = nSweden;
for (nDanmark=2;nDanmark<6;nDanmark++){
if (nDanmark == nEnglish || nDanmark == nSweden )//排除挪威人、英国人、瑞典人的住房
continue;
else{
dtea=nDanmark;
for(nGermany=2;nGermany<6;nGermany++){
if(nGermany==nEnglish || nGermany== nSweden || nGermany== nDanmark)//排除挪威人、英国人、瑞典人、丹麦人的住房
continue;
else{
sprince = nGermany;
for(cgreen=1;cgreen < 5;cgreen++)
/*排除红色、蓝色*/
if(cgreen == cred || cgreen + 1 == cred || cgreen ==2 || cgreen + 1 == 2 || cgreen ==3)
continue;
else{
cwhite = cgreen + 1;
dcoffee = cgreen;
for (cyellow = 1 ;cyellow < 6; cyellow++)
if(cyellow == cred || cyellow == cgreen || cyellow == cwhite || cyellow ==2 || cyellow == sprince)
continue;
else{
sdunhill=cyellow;
for(pbird = 1;pbird <6 ; pbird++){
if(pbird == pdog || pbird == sprince || pbird ==sdunhill )
continue;
else{
spail = pbird;
for(pcat = 1;pcat <6;pcat++){
if (pcat == pdog || pcat == pbird )
continue;
else{
for(phorse =1;phorse <6;phorse++){
if(phorse == pdog || phorse == pbird || phorse == pcat)
continue;
else{
for(dbeer =1;dbeer <6;dbeer++){
if (dbeer == 3 || dbeer ==dtea || dbeer == dcoffee || dbeer == sprince || dbeer == sdunhill || dbeer == spail )
continue;
else{
sblue = dbeer;
for (dwater = 1; dwater < 6;dwater++){
if (dwater == dtea || dwater == dcoffee || dwater == dbeer || dwater==3)
continue;
else{
for(sblends=1;sblends <6;sblends++){
if (sblends == sprince || sblends == spail || sblends == sdunhill || sblends == sblue)
continue;
else{
if ((sblends - pcat)*(sblends - pcat) == 1 && (sdunhill - phorse)*(sdunhill - phorse) == 1 && (sblends - dwater)*(sblends - dwater) == 1)
{
a[0][0]="挪威";a[0][nEnglish-1]="英国";a[0][nSweden-1]="瑞典";a[0][nDanmark-1]="丹麦";a[0][nGermany-1]="德国";
a[1][cred-1]="红色";a[1][cgreen-1]="绿色";a[1][cwhite-1]="白色";a[1][cyellow-1]="黄色";a[1][1]="蓝色";
a[2][2]="牛奶";a[2][dtea-1]="茶";a[2][dcoffee-1]="咖啡";a[2][dwater-1]="水";a[2][dbeer-1]="啤酒";
a[3][pdog-1]="狗";a[3][pbird-1]="鸟";a[3][pcat-1]="猫";a[3][phorse-1]="马";
a[4][sprince-1]="Prince";a[4][spail-1]="Pail Mail";a[4][sdunhill-1]="Dunhill";a[4][sblue-1]="Blue Master";a[4][sblends-1]="Blends";
for(int i=0;i<5;i++){
if (a[3][i].equals("no"))
a[3][i]="鱼★";
}
for(int i=0;i<5;i++)
for(int j=0;j<5;j++){
jt[i][j].setText(a[i][j]);
if (jt[i][j].getText().equals("鱼★")){
n = i;
m = j;
}
}
jt[n][m].setToolTipText("答案是丰富多彩的!");
JOptionPane.showMessageDialog(this,"答案是:"+a[0][m]+"人养鱼!");
/*System.out.print("nE=" + nEnglish + "nS=" + nSweden
+ "nD=" + nDanmark + "nG=" + nGermany );
System.out.println();
System.out.print("cr=" + cred + "cg=" + cgreen + "cw=" + cwhite + "cy=" + cyellow);
System.out.println();
System.out.print("dt=" + dtea + "dc=" + dcoffee + "dw=" + dwater + "db=" +dbeer);
System.out.println();
System.out.print("pd=" + pdog + "pb=" + pbird + "pc=" + pcat + "ph=" + phorse);
System.out.println();
System.out.print("sprince=" +sprince + "spail=" +spail+"sdunhill=" +sdunhill+"sblue="+sblue+"sblends=" + sblends);
System.out.println();*/
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
|