首页 > 编程知识 正文

爱因斯坦难题,工程问题解答

时间:2023-05-03 22:02:20 阅读:114242 作者:2161

看这样的问题,主题叫做《爱因斯坦的问题》。 光看主题就很有趣。 打开看问题内容,第一个反应是“昏厥”,在纸上画画,大致整理了一下思路,但是计算起来很辛苦,所以打算写程序请人帮忙。

首先贴上问题的内容:

爱因斯坦超市问题

1、一条街上,有五座房子,有五种颜色。

2、每个房间住着不同国籍的人

3、不同人群喝不同的饮料,抽不同品牌的烟,养不同的宠物

问题是谁在养鱼?

提示:

1、英国人住在红色的房子里

2、瑞典人养狗

3、丹麦人喝茶

4、绿色的房子在白色房子的左边

5、绿房子的主人喝咖啡

6、PallMall抽烟的人养鸟

7、黄家主人抽烟Dunhill

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

9、挪威人住在第一个房间

10、Blends抽烟的人住在养猫人旁边

11、养马的人住在Dunhill抽烟的人旁边

12、吸蓝大师的人喝啤酒

13、德国人吸烟Prince

14、挪威人住在蓝房子旁边

15、Blends抽烟的人喝水的邻居用程序解决这个问题,第一反应就是穷法。 现在开始计算一下贫困法有几种组合。 一条街包括五个有序的房子,每个房子都有五个不同的属性:国籍、颜色、宠物、饮料和香烟。 五户人家同一类型的属性不同,所以每个属性都有五!=120种组合,5种属性加起来,共有120^5=24883200000种! 将近250亿了。

直接列举这种情况太不恰当了,所以在使用穷举法时,不是先确定一个组合后再判断是否符合条件,而是确定组合中的某些属性后再马上判断更快。

我想把房子和街道抽象成java班,但是因为有点感兴趣,所以只写了一个班,以解决问题为中心。 直接去下面的代码。

import java.util.ArrayList; 公共类输入{私有类输入[ ] men={ '挪威'、'瑞典'、'英国'、'丹麦'、'德国' }; 私密静态金融int Norway=0; 私密静态最终输入窗口=1; 私有静态最终输入引擎=2; 私密静态金融int Denmark=3; 私密静态金融int Germany=4; //====================================私有静态帧输入比特=1; 私有静态金融中心=2; 私密静态金融int cat=3; 私密静态金融int fish=4; //====================================私有静态最终输入红色=1; 私有静态最终输入黄色=2; 私密静态金融int white=3; 私密静态金融绿色=4; //====================================私密静态金融int coffe=1; 私有静态金融int beer=2; 私密静态金融等待=3; 私密静态金融int tee=4; //====================================私密静态金融int DH=1; p

rivate static final int BM = 2;private static final int P = 3;private static final int B = 4;// ================================================================private static final ArrayList<int[]> list = new ArrayList<int[]>(120);public static void main(String[] args) {// 先生成0-4的全排列。算法很笨,但是很有效。for (int i1 = 0; i1 < 5; i1++) {for (int i2 = 0; i2 < 5; i2++) {if (i2 == i1) {continue;}for (int i3 = 0; i3 < 5; i3++) {if (i3 == i1 || i2 == i1 || i2 == i3) {continue;}for (int i4 = 0; i4 < 5; i4++) {if (i3 == i1 || i2 == i1 || i4 == i1 || i3 == i4|| i3 == i2 || i2 == i4) {continue;}int[] arr = new int[] { i1, i2, i3, i4,(10 - i1 - i2 - i3 - i4) };list.add(arr);}}}}getM();}/** * 国籍的全排列 */private static final void getM() {long begin = System.nanoTime();// 开始for (int[] men : list) {if (men[0] != NORWAY) {// 9、挪威人住第一间房continue;}getC(men);}System.out.println("耗时:" + (System.nanoTime() - begin) + "纳秒。");}/** * 颜色的全排列 */private static void getC(int[] men) {out: for (int[] color : list) {if (color[1] != BLUE || color[4] == GREEN) {// 14、挪威人住蓝色房子隔壁// 所以,左起第二间房屋一定是蓝色色的// 4、绿色房子在白色房子左面// 所以,最右边的房屋一定不是绿色的continue;}for (int i = 0; i < 4; i++) {if (color[i] == GREEN && color[i + 1] != WHITE) {// 4、绿色房子在白色房子左面continue out;}}for (int i = 0; i < 5; i++) {if (men[i] == ENGLAND && color[i] != RED) {// 1、英国人住红色房子continue out;}}getP(men, color);}}/** * 宠物的全排列 */private static void getP(int[] men, int[] color) {out: for (int[] pet : list) {for (int i = 0; i < 5; i++) {if (men[i] == SWEDEN && pet[i] != DOG) {// 2、瑞典人养狗continue out;}}getW(men, color, pet);}}/** * 饮料的全排列 */private static void getW(int[] men, int[] color, int[] pet) {out: for (int[] win : list) {if (win[2] != MILK) {// 8、住在中间房子的人喝牛奶continue;}for (int i = 0; i < 5; i++) {if (men[i] == DENMARK && win[i] != TEE) {// /3、丹麦人喝茶continue out;}}for (int i = 0; i < 5; i++) {if (color[i] == GREEN && win[i] != COFFE) {// 5、绿色房子主人喝咖啡continue out;}}getS(men, color, pet, win);}}/** * 香烟的全排列 */private static void getS(int[] men, int[] color, int[] pet, int[] win) {out: for (int[] smo : list) {for (int i = 0; i < 5; i++) {if (pet[i] == BIRD && smo[i] != PM) {// 6、抽PallMall香烟的人养鸟continue out;}}for (int i = 0; i < 5; i++) {if (color[i] == YELLOW && smo[i] != DH) {// 7、黄色房子主人抽Dunhill香烟continue out;}}for (int i = 0; i < 5; i++) {if (win[i] == BEER && smo[i] != BM) {// /12、抽BlueMaster的人喝啤酒continue out;}}for (int i = 0; i < 5; i++) {int man = men[i];if (man == GERMANY && smo[i] != P) {// 13、德国人抽Prince香烟continue out;}}boolean b = true;for (int i = 0; i < 4; i++) {if ((smo[i] == B && pet[i + 1] == CAT)|| (smo[i + 1] == B && pet[i] == CAT)) {// 10、抽Blends香烟的人住在养猫的人隔壁b = false;break;}}if (b) {continue;}b = true;for (int i = 0; i < 4; i++) {if ((smo[i] == B && win[i + 1] == WHAT)|| (smo[i + 1] == B && win[i] == WHAT)) {// 15、抽Blends香烟的人有一个喝水的邻居b = false;break;}}if (b) {continue;}b = true;for (int i = 0; i < 4; i++) {if ((smo[i] == DH && pet[i + 1] == HORSE)|| (smo[i + 1] == DH && pet[i] == HORSE)) {// 11、养马的人住抽Dunhill香烟的人隔壁b = false;break;}}if (b) {continue;}int[][] old = new int[][] { men, color, pet, win, smo };print(old);}}/** * 打印结果 */private static final void print(int[][] old) {int[][] arr = new int[5][5];// 转置for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {arr[j][i] = old[i][j];}}StringBuilder sb = new StringBuilder("房屋位置t国籍t房子颜色t宠物t饮料t香烟");for (int i = 0; i < arr.length; i++) {sb.append("n左起").append(i + 1);sb.append("t").append(MEN[arr[i][0]]);sb.append("t").append(COL[arr[i][1]]);sb.append("t").append(PET[arr[i][2]]);sb.append("t").append(WIN[arr[i][3]]);sb.append("t").append(SMO[arr[i][4]]);}sb.append("n============================");System.out.println(sb);}}

 在MyEclipse中的运行结果:



 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。