`
maybe723
  • 浏览: 45992 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

爱因斯坦问题的解法

阅读更多

题目是这样的:

 

有5个不同国籍的人,住在5所颜色不同的一排房子里,养不同的宠物,抽不同的烟,喝不同的饮料,有以下提示:

1 英国人住在红房子里

2 瑞典人养了一条狗

3 丹麦人喝茶

4 绿房子在白房子左边

5绿房子主人喝咖啡

6抽PALL MALL烟的人养了一只鸟

7黄房子的主人抽DUNHILL烟

8住在中间那间房子的人喝牛奶

9挪威人住第一间房子

10抽混合烟的人住在养猫人的旁边

11养马人住在抽DUNHILL烟的人的旁边

12抽BLUE MASTER烟的人喝啤酒

13德国人抽PEINCE烟

14挪威人住在蓝房子旁边

15抽混合烟的人的邻居喝矿泉水

问:谁养鱼?

 

 

 

public class House implements Cloneable{

 

    public int order;

    public String color="";

    public String people="";

    public String drink="";

    public String smoke="";

    public String pet="";

   

    public House(int order) {

       super();

       this.order = order;

    }

    public House(){

    }

    public House(String color, String people, String drink,

           String smoke, String pet) {

   

       this.color = color;

       this.people = people;

       this.drink = drink;

       this.smoke = smoke;

       this.pet = pet;

    }

   

    public String toString() {

       String str=order+".["+color+"],["+people+"],["+drink+"],["+smoke+"],["+pet+"]";

       return str;

    }

    public int getOrder() {

       return order;

    }

    public void setOrder(int order) {

       this.order = order;

    }

    public String getColor() {

       return color;

    }

    public void setColor(String color) {

       this.color = color;

    }

    public String getPeople() {

       return people;

    }

    public void setPeople(String people) {

       this.people = people;

    }

    public String getDrink() {

       return drink;

    }

    public void setDrink(String drink) {

       this.drink = drink;

    }

    public String getSmoke() {

       return smoke;

    }

    public void setSmoke(String smoke) {

       this.smoke = smoke;

    }

    public String getPet() {

       return pet;

    }

    public void setPet(String pet) {

       this.pet = pet;

    }

    @Override

    protected Object clone() throws CloneNotSupportedException {

       // TODO Auto-generated method stub

       return super.clone();

    }

}

 

 

import static java.lang.System.out;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class Result {
	private final static String PEOPLE_ENGLISH = "英国人"; // "英国人", "瑞典人",
	// "丹麦人","挪威人", "德国人"
	private final static String PEOPLE_SWEEDEN = "瑞典人";
	private final static String PEOPLE_DANMARK = "丹麦人";
	private final static String PEOPLE_NORWAY = "挪威人";
	private final static String PEOPLE_GERMEN = "德国人";

	private final static String COLOR_RED = "红"; // "红", "白", "绿", "黄", "蓝"
	private final static String COLOR_WHITE = "白";
	private final static String COLOR_GREEN = "绿";
	private final static String COLOR_YELLOW = "黄";
	private final static String COLOR_BLUE = "蓝";

	private final static String DRINK_TEA = "茶"; // "茶", "咖啡", "牛奶", "啤酒",
	// "矿泉水"
	private final static String DRINK_COFFEE = "咖啡";
	private final static String DRINK_MILK = "牛奶";
	private final static String DRINK_BEER = "啤酒";
	private final static String DRINK_WATER = "矿泉水";

	private final static String SMOKE_PALL = "PALL MALL"; // "PALL MALL",
	// "DUNHILL",
	// "混合烟","BLUE MASTER", "PEINCE"
	private final static String SMOKE_DUNHILL = "DUNHILL";
	private final static String SMOKE_MIXTRUE = "混合烟";
	private final static String SMOKE_MASTER = "BLUE MASTER";
	private final static String SMOKE_PRINCE = "PEINCE";

	private final static String PET_DOG = "狗"; // "狗", "鸟", "猫", "马", "鱼"
	private final static String PET_BIRD = "鸟";
	private final static String PET_CAT = "猫";
	private final static String PET_HORSE = "马";
	private final static String PET_FISH = "鱼";

	private static List<House> houseList = new ArrayList<House>();
	private static List<House> conList = new ArrayList<House>();
	private static House house1 = new House(1);
	private static House house2 = new House(2);
	private static House house3 = new House(3);
	private static House house4 = new House(4);
	private static House house5 = new House(5);

	static {
		houseList.add(house1);
		houseList.add(house2);
		houseList.add(house3);
		houseList.add(house4);
		houseList.add(house5);
	}

	public static void clear() {
		for (int i = 0; i < houseList.size(); i++) {
			House h = houseList.get(i);
			h.color = "";
			h.drink = "";
			h.people = "";
			h.pet = "";
			h.smoke = "";
		}
	}

	private static void init() {
		house1.people = PEOPLE_NORWAY;
		house2.color = COLOR_BLUE;
		house3.drink = DRINK_MILK;
	}

	private static void compare(boolean check) throws Exception {
		
		boolean tempcheck=false;
		for (int i = 0; i < houseList.size(); i++) {

			for (int j = i; j < houseList.size(); j++) {
				House hi = houseList.get(i);
				House hj = houseList.get(j);
				
				if(check){
					tempcheck=(hi.order+1 <hj.order);
				}else{
					tempcheck=(hi.order+1==hj.order);
				}

				if ("".equals(hi.color) && "".equals(hj.color)
						&&tempcheck) { //
					hi.color = COLOR_GREEN;
					hj.color = COLOR_WHITE;
					for (int k = 0; k < houseList.size(); k++) {

						for (int m = 0; m < houseList.size(); m++) {
							House hk = houseList.get(k);
							House hm = houseList.get(m);

							if (hk.order == hm.order + 1 || hm.order == hk.order + 1) {
								if ("".equals(hk.pet) && "".equals(hm.smoke)) {
									hk.pet = PET_HORSE;
									hm.smoke = SMOKE_DUNHILL; // 养马人住在抽DUNHILL烟的人的旁边

									for (int n = 0; n < houseList.size(); n++) {

										for (int p = 0; p < houseList.size(); p++) {
											House hn = houseList.get(n);
											House hp = houseList.get(p);

											if (hn.order == hp.order + 1 || hp.order == hn.order + 1) {
												if ("".equals(hn.smoke)
														&& "".equals(hp.pet)) {
													hn.smoke = SMOKE_MIXTRUE;
													hp.pet = PET_CAT; // 抽混合烟的人住在养猫人的旁边
													for (int q = 0; q < houseList
															.size(); q++) {
														House hq = houseList
																.get(q);
														if ((((hn.order == hq.order - 1) || (hn.order == hq.order + 1)) && ""
																.equals(hq.drink))) { // 抽混合烟的人的邻居喝矿泉水
															hq.drink = DRINK_WATER;
															//printResult();
															getResult(getList(houseList),getList(houseList),0,0);
															hq.drink = "";
														}
													}

													hn.smoke = "";
													hp.pet = "";
												}
											}
										}
									}
									hk.pet = "";
									hm.smoke = "";
								}
							}
						}
					}
					clear();
					init();
				}
			}
		}
	}

	private static void getResult(List tempList, List<House> tempList1,
			int start, int num) throws Exception {
		if(num==conList.size()) {
		out.println("====================");
		for (int i = 0; i < tempList1.size(); i++) {
			House house = tempList1.get(i);
			out.println(house);
		}
		out.println("====================");
		return;
	   }
		
		for (int k = start; k < conList.size(); k++) {
			House hk = conList.get(k);
			Map<String, String> maps = getFields(hk);
			Iterator iterator = maps.entrySet().iterator();
			String str = "";

			while (iterator.hasNext()) {
				Map.Entry<String, String> entry = (Map.Entry) iterator.next();
				String key = entry.getKey();
				String value = entry.getValue();
				if (!"".equals(value)) {
					str += key + ",";
				}
			}
			boolean tcheck = true; // 判断条件是否符合
			for (int i = 0; i < tempList.size(); i++) {
				House house = tempList1.get(i);
				Map<String, String> houseMaps = getFields(house);
				// 把所有非空元素的拿出来
				String[] strs = str.split(",");
				if (strs.length > 0) {
					int c = 0;
					for (int m = 0; m < strs.length; m++) {
						String temp = (String) house.getClass().getField(
								strs[m]).get(house); // 得到当前节点元素的值
						String temp1 = (String) hk.getClass().getField(strs[m])
								.get(hk); // 得到当前条件的元素的值
						// 如果当前节点的值不为空以及两个条件不相等,说明该条件不符合,否则符合条件
						if (!"".equals(temp) && !temp.equals(temp1)) {
							tcheck = false;
							break;
						}else tcheck=true;
						
					}
					if (tcheck) {
						for (int m = 0; m < strs.length; m++) {
							String temp = (String) hk.getClass().getField(
									strs[m]).get(hk); // 条件的值
							if (c != strs.length) {
								setValueByField(house, strs[m], temp); // 更新条件的值
							}
						}
						num++;
						getResult(getList(tempList1), getList(tempList1), 
								k + 1, num);
						for (int m = 0; m < strs.length; m++) {
							
							if (c != strs.length) {
								setValueByField(house, strs[m], ""); // 还原条件的值
							}
						}
						num--;
					}
				}
			}
			if(tcheck) return;
		}
		return;
	}


   /**
    * 克隆list
    * @param list
    * @return
    * @throws Exception
    */
	private static List<House> getList(List<House> list) throws Exception {
		List<House> tempList = new ArrayList<House>();
		for (int j = 0; j < list.size(); j++) {
			House hou = (House) (list.get(j).clone());
			tempList.add(hou);
		}
		return tempList;
	}

	//设置当前类的字段为field的值为value
	private static void setValueByField(Object obj, String field, Object value) {

		try {
			String firstW = field.substring(0, 1);
			String methodName = "set" + firstW.toUpperCase()
					+ field.substring(1);
			Class c = obj.getClass();
			Method[] ms = c.getMethods();
			for (Method m : ms) {
				if (m.getName().equals(methodName)
						&& m.getParameterTypes().length == 1) {
					Object[] params = { value };
					try {
						m.invoke(obj, params);
						return;
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
			Field[] fs = c.getFields();
			for (Field f : fs) {
				if (f.getName().equals(field)) {
					try {
						f.set(obj, value);
						return;
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	// 判断条件
	private static void initCondition() {
		House house1 = new House(COLOR_RED, PEOPLE_ENGLISH, "", "", "");// 英国人住在红房子里
		House house2 = new House("", PEOPLE_SWEEDEN, "", "", PET_DOG); // 瑞典人养了一条狗
		House house3 = new House("", PEOPLE_DANMARK, DRINK_TEA, "", ""); // 丹麦人喝茶
		House house5 = new House(COLOR_GREEN, "", DRINK_COFFEE, "", ""); // 绿房子主人喝咖啡
		House house6 = new House("", "", "", SMOKE_PALL, PET_BIRD); // // MALL烟的人养了一只鸟
		House house7 = new House(COLOR_YELLOW, "", "", SMOKE_DUNHILL, ""); // 黄房子的主人抽DUNHILL烟
		House house12 = new House("", "", DRINK_BEER, SMOKE_MASTER, ""); // 抽BLUE MASTER烟的人喝啤酒
		House house13 = new House("", PEOPLE_GERMEN, "", SMOKE_PRINCE, ""); // 德国人抽PEINCE烟
		House house16 = new House("", "", "", "", PET_FISH);  //鱼
		conList.add(house1);
		conList.add(house2);
		conList.add(house3);
		conList.add(house5);
		conList.add(house6);
		conList.add(house7);
		conList.add(house12);
		conList.add(house13);
		conList.add(house16);
	}

    /**
     * 根据当前类得到所有的String类型的成员
     * @param obj
     * @return
     */
	private static Map<String, String> getFields(Object obj) {
		Map<String, String> map = new HashMap<String, String>();
		try {
			Class cls = obj.getClass();
			Field[] fields = cls.getDeclaredFields();

			Method method;
			Object o = cls.newInstance();

			for (int i = 0; i < fields.length; i++) {
				String fieldName = fields[i].getName();
				String first = fieldName.substring(0, 1);
				String upFisrt = first.toUpperCase();
				String geter = "get" + upFisrt + fieldName.substring(1);
				method = cls.getMethod(geter, new Class[] {});
				Object invoke = method.invoke(obj, new Object[] {});
				if (invoke instanceof String)
					map.put(fieldName, (String) method.invoke(obj,
							new Object[] {}));
			}
		} catch (Exception e) {
		}
		return map;

	}

	public static void main(String[] args) throws Exception {
		boolean check=false; //false为相邻,true为不相邻
		init();
		initCondition();
		compare(check);
	}

}

 

 

 

分享到:
评论

相关推荐

    爱因斯坦难题C语言解法.rar

    爱因斯坦难题C语言解法 1、 在一条街上,有5座房子,喷了5种颜色。 2、 每个房里住着不同国籍的人 3、 每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物 约束条件: 1、 英国人住红色房子 2、 瑞典人养狗 3...

    哈密​​顿量解法–第1部分:经典引力协变理论

    广义相对论中的一个具有挑战性的问题涉及确定基于爱因斯坦场方程的明显协变连续哈密顿结构以及相应的协变哈密顿-雅各比理论的相关表述。 该任务是通过采用同步变分原理来实现的,该原理要求区分爱因斯坦场方程的规定...

    大数据-算法-若干非线性数学物理问题的解析和数值研究.pdf

    同时,通过对流层流体模型的研究,得到了耦合变系数mKdV方程,并通过严格的解法,如Bäcklund变换,来求解这些变系数方程。 论文的第三章构建了一个涡旋相互作用模型,通过对模型的李代数对称性和守恒定律的分析,...

    修正引力下的广义相对论解

    我们阐明了修改重力理论以允许GR解的三个条件,即具有满足GR中的爱因斯坦方程式和标量场恒定轮廓的度量的解决方案。 我们的分析相当笼统,因为它适用于存在物质组分的情况下修正重力的各种单场/多场标量张量理论,...

    球形完美流体的引力场

    文章标题《球形完美流体的引力场》涉及的是广义相对论中的一个具体问题,即分析静态球状分布的完美流体时空特性,这是广义相对论中关于引力场方程的解法之一。在广义相对论中,完美流体是一种理想化的物质模型,其中...

    北京工业大学861量子力学2021年初试大纲.pdf

    - **一般讨论**:介绍了一维定态问题的基本解法,如分离变量法等。 - **自由粒子**:研究没有外力作用下的粒子的量子态。 - **一维方势阱**:分析了粒子在有限深度或无限深度方势阱中的束缚态。 - **一维势垒**:...

    浅谈微分方程起源及发展史.doc

    1690年左右,这些问题的探索催生了对特定类型微分方程解法的研究,尽管这些方法最初仅适用于有限的场景,但它们对于理解和解决力学和几何问题具有重大意义。 微分方程在实际问题中的应用广泛,比如在生物学中,可以...

    2021-2022年收藏的精品资料专题01 物理学史问题(解析版).doc

    这些物理学史问题的考法与解法可以帮助学生更深入地理解物理定律的来源,增强他们解决问题的能力。例如,压强单位是以帕斯卡命名的,这是基于帕斯卡对压力和压强的研究;原子结构模型中,卢瑟福的模型最接近现代理解...

    Cc++趣味程序百例(学习不枯燥!)

    - 八皇后问题:实现八皇后问题的解法,学习如何避免冲突并放置皇后。 6. **数学应用**: - 求π的近似值:通过算法计算π的近似值,如马赫林级数或蒙特卡洛方法。 - 角谷猜想:编程验证角谷猜想,即所有正整数的...

    虫洞和霍金温度接近视界的宇宙学模型

    在本文中,以与McVittie解法相似的方式导出了具有莫里斯-索恩(Morris-Thorne)型虫洞各向同性形式的宇宙模型。 通过用合理的物质分布求解爱因斯坦的场方程,我们找到了嵌在弗里德曼-莱马特-罗伯逊-沃克宇宙中的虫洞...

    标量源消失的标量解和标量标度的分类

    我们推导了d + 2维中最小耦合的爱因斯坦-麦克斯韦-标量重力的精确Brane解,并且标量势消失了,我们证明了这些解与Lifshitz时空是共形的,其双重QFT具有超尺度违规的特征。 这些解决方案与AdS麸和指数势所产生的畴壁...

    《数学方法论与解题研究》期末试题资料.pdf

    例如,陈氏定理是由我国著名数学家陈景润提出的,化归是解决问题的关键方法,演绎法是逻辑证明的重要工具,爱因斯坦在1905年提出的狭义相对论,完全归纳法包括群举归纳法和类分法,波利亚是首位系统研究解题理论的...

    SUMS43 General Relativity, N. M. J. Woodhouse (2007).zip

    书中可能会详细解析这些方程,包括解法示例和物理意义。 7. **坐标系的选择**:在非惯性坐标系中处理相对论问题是一项挑战。Woodhouse可能探讨了不同的坐标变换和坐标选择对解的影响。 8. **实验验证**:书中还...

    超冷原子转移线圈模拟 MATLAB Codes for Transfer Coils

    超冷原子转移线圈模拟是量子物理实验中的一个重要研究领域,特别是在玻色-爱因斯坦凝聚(BEC)的研究中。BEC是一种奇特的量子态,其中大量的原子以单个量子态共同存在,表现出宏观的量子力学性质。在这个场景中,...

    勘误如下:中心引力场中的f(R)-理论的摄动解及其某些应用

    在物理学领域,特别是广义相对论与宇宙学的研究中,f(R)理论作为扩展爱因斯坦引力理论的一种方式受到了广泛的关注。这种理论将引力作用的拉格朗日量由标量曲率R扩展到R的任意函数f(R),为解释宇宙加速膨胀等现象提供...

    大连理工大学806 量子力学2021年考研专业课初试大纲.pdf

    - **量子力学的产生**: 量子力学作为20世纪物理学的重要分支之一,起源于1900年普朗克提出的能量量子化假设,随后爱因斯坦提出了光量子假说。这些理论的发展为量子力学的建立奠定了基础。 - **德布罗意物质波**: ...

    热力学 统计物理学答案

    热力学与统计物理学是物理学的两个重要分支,它们在研究物质的基本性质和行为方面起着核心作用。热力学主要关注宏观系统的平衡态性质,...解答书中涵盖了各种问题的解法,帮助学生巩固知识,提高分析和解决问题的能力。

    Introduction and review of Matlab.ppt

    这里引入了爱因斯坦关系,它描述了扩散系数D与温度T、离子的活度a和迁移率v之间的关系,即D=kT/6πηa。其中,k是玻尔兹曼常数,η是溶液的粘度。这一关系帮助我们理解离子在膜内外的扩散行为对信号传递的影响。 在...

    【量子力学】 第9章:自旋.pdf

    量子力学中角动量的研究包括总角动量和角动量的代数解法。角动量的耦合是一个重要概念,它涉及到两个角动量系统如何组合成一个总的系统,例如,电子的自旋与轨道角动量的耦合。在微观尺度上,粒子的总角动量是守恒量...

    吴军数学通识50讲.pdf

    9. **方程与三次方程**:探讨了方程作为数学工具的重要性,以及历史上关于三次方程解法的争议。 10. **虚数**:介绍了虚数的概念,解释了看似虚构的数学对象在物理和工程中的实际用途。 11. **无穷与无穷小**:...

Global site tag (gtag.js) - Google Analytics