![]() |
|
世界上有98%的人答不出来 - 打印版本 +- MyTFLS社区 (https://community.mytfls.com) +-- 论坛: 娱乐大排挡 (https://community.mytfls.com/forum-1.html) +--- 论坛: 网文大杂烩 (https://community.mytfls.com/forum-2.html) +--- 主题: 世界上有98%的人答不出来 (/thread-10488.html) |
- gilling_mao - 2006-1-29 这个 意思不大吧 爱因斯坦什么企图啊?? - 花尾 - 2006-1-30 企图:使人思维紊乱,最后自杀. - peggy610202 - 2006-1-30 首先说:有答案哇? - michael-faker - 2006-1-30 首先想到用c解题,果然从网上找到了源码: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> using System; namespace netsafe.math { public class ayst { /// <summary> /// 问题中的所有元素 /// </summary> string[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"}, {"挪威人","英国人","德国人","丹麦人","瑞典人"}, {"DUNHILL","PRINCE","混合烟", "PALL MALL","BLUE MASTER"}, {"咖 啡","矿泉水","茶","牛奶"," 啤酒 "}, {"鱼","猫","马", "鸟","狗"}}; /// <summary>/// answer用来存放答案 /// </summary> int[,] answer=new int[6, 6]; int[,] ALL=new int[6,122]; int count=1; int nLevel = 0; int[] List=new int[6]; public static void Main(string[] args) { ayst c=new ayst(); c.p(); ///生成全排列到all c.run(); Console.Read(); /// 按任意键继续 } void run() { int i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序 for (i1=1;i1<=120;i1++)///房子 { ///9 、挪威人住第一间房子 ///14 、挪威人住在蓝房子旁边 ///不满足条件就短路 /// if (ALL[2,i1]!=2)continue; for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]); for (i2=1;i2<=120;i2++)///人种 { for(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]); ///9 、挪威人住第一间房子 if (ALL[1,i2]!=1)continue; ///1、 英国人住在红房子里 /// if (find(1,4)!=find(2,2))continue; ///4 、绿房子在白房子左边 /// if (find(1,5)>find(1,3))continue; for (i3=1;i3<=120;i3++)///烟 { for(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]); ///13、 德国人抽PRINCE烟 /// if(find(2,3)!=find(3,2))continue; ///7 、黄房子主人抽DUNHILL烟 /// if(find(1,1)!=find(3,1))continue; for (i4=1;i4<=120;i4++)///饮料 { for(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]); ///8 、住在中间那间房子的人喝牛奶 /// if(ALL[3,i4]!=4)continue; ///5 、绿房子主人喝咖啡 /// if (find(1,5)!=find(4,1))continue; ///3 、丹麦人喝茶 /// if(find(2,4)!=find(4,3))continue; ///15 、抽混合烟的人的邻居喝矿泉水 if(Math.Abs(find(3,3)-find(4,2))!=1)continue; ///12 、抽BLUE MASTER烟的人喝啤酒 /// if(find(3,5)!=find(4,5))continue; for (i5=1;i5<=120;i5++)///宠物 { for(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]); ///10 、抽混合烟的人住在养鱼人的旁边 /// if(Math.Abs(find(3,3)-find(5,1))!=1)continue; ///2 、瑞典人养了一条狗 /// if(find(2,5)!=find(5,5))continue; ///6 、抽PALL MALL烟的人养了一只鸟 /// if(find(3,4)!=find(5,4))continue; ///11 、养马人住在DUNHILL烟的人旁边 /// if(Math.Abs(find(5,3)-find(3,1))!=1)continue; /// ///能活到这里的data,当然是答案喽 /// write_answer(); } } } } } } /// <summary> /// 非常典型的用递归实现排列组合算法。 /// </summary> public void p() { int nCount,nJudge,key; nLevel++; if(nLevel>5) { writeall();///有一种排列就写到All数组里 nLevel--; return; } for(nCount=1;nCount<=5;nCount++) { key=0; for(nJudge=0;nJudge<=nLevel-1;nJudge++) if(nCount==List[nJudge]) { key=1; break; } if(key==0) { List[nLevel]=nCount; p(); } } nLevel--; } /// <summary> /// 写入all数组 /// </summary> void writeall() { int i; for (i=1;i<=5;i++) { ALL[i,count]=List; } count++; } int find(int i,int j) { int k; for(k=0;k<=5;k++) { if (answer[k,i]==j) { return k; } } return -1; } /// <summary> /// 将答案打印出来 /// </summary> void write_answer() { for (int i = 1;i<=5;i++) { for(int j=1 ;j<=5;j++) { Console.Write(data[i-1,answer[j,i]-1]+","); } Console.WriteLine(); } Console.WriteLine(); } } } 以下是程序的运行结果(答案一共7种): 黄房子,蓝房子,红房子,绿房子,白房子, 挪威人,丹麦人,英国人,德国人,瑞典人, DUNHILL,混合烟,PALL MALL,PRINCE,BLUE MASTER, 矿泉水,茶,牛奶,咖 啡, 啤酒 , 鱼,马,鸟,猫,狗, 绿房子,蓝房子,黄房子,红房子,白房子, 挪威人,德国人,瑞典人,英国人,丹麦人, 混合烟,PRINCE,DUNHILL,BLUE MASTER,PALL MALL, 咖 啡,矿泉水,牛奶, 啤酒 ,茶, 猫,鱼,狗,马,鸟, 绿房子,蓝房子,白房子,黄房子,红房子, 挪威人,德国人,瑞典人,丹麦人,英国人, PALL MALL,PRINCE,混合烟,DUNHILL,BLUE MASTER, 咖 啡,矿泉水,牛奶,茶, 啤酒 , 鸟,鱼,狗,猫,马, 绿房子,蓝房子,白房子,黄房子,红房子, 挪威人,德国人,瑞典人,丹麦人,英国人, PALL MALL,PRINCE,混合烟,DUNHILL,BLUE MASTER, 咖 啡,矿泉水,牛奶,茶, 啤酒 , 鸟,猫,狗,鱼,马, 绿房子,蓝房子,白房子,红房子,黄房子, 挪威人,德国人,瑞典人,英国人,丹麦人, PALL MALL,PRINCE,混合烟,BLUE MASTER,DUNHILL, 咖 啡,矿泉水,牛奶, 啤酒 ,茶, 鸟,鱼,狗,马,猫, 绿房子,蓝房子,红房子,黄房子,白房子, 挪威人,德国人,英国人,丹麦人,瑞典人, PALL MALL,PRINCE,混合烟,DUNHILL,BLUE MASTER, 咖 啡,矿泉水,牛奶,茶, 啤酒 , 鸟,鱼,马,猫,狗, 绿房子,蓝房子,红房子,黄房子,白房子, 挪威人,德国人,英国人,丹麦人,瑞典人, PALL MALL,PRINCE,混合烟,DUNHILL,BLUE MASTER, 咖 啡,矿泉水,牛奶,茶, 啤酒 , 鸟,猫,马,鱼,狗 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 以上内容转自数模论坛。 [ Last edited by michael-faker on 2006-1-31 at 10:21 ] - 蓝色的风 - 2006-1-31 我晕!快打120!!! - 酒旗风 - 2006-1-31 这个我参加数学建模的时候看过 还不是很bt 有非常bt的题目了 - 花尾 - 2006-2-2 楼上的还有那个楼上楼上又楼上的,真强了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - dxy972 - 2006-2-2 我养鱼…… - 林子 - 2006-2-2 很经典的逻辑题~ 如果被我看到我会做一件事:立即转身逃跑~ - 411917313 - 2006-2-3 中国人 奇强! |