题 目 二:“爱因斯坦”高智商逻辑推理 5

题目二:“爱因斯坦”高智商逻辑推理题目描述:a.有五栋五种颜色的房子b.每一位房子的主人国籍都不同c.这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物d.没有人... 题 目 二:“爱因斯坦”高智商逻辑推理
题目描述:a. 有五栋五种颜色的房子 b. 每一位房子的主人国籍都不同 c. 这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物 d. 没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料 条件提示: 1 英国人住在红房子里 2 瑞典人养了一条狗 3 丹麦人喝茶 4 绿房子在白房子左边 5 绿房子主人喝咖啡 6 抽 PALL MALL 烟的人养了一只鸟 7 黄房子主人抽 DUNHILL 烟 8 住在中间那间房子的人喝牛奶 9 挪威人住第一间房子 10 抽混合烟的人住在养猫人的旁边 11 养马人住在 DUNHILL 烟的人旁边 12 抽 BLUE MASTER 烟的人喝啤酒 13 德国人抽 PRINCE 烟 14 挪威人住在蓝房子旁边 15 抽混合烟的人的邻居喝矿泉水。问题是:谁养鱼 (1)瑞典人 (2)英国人 (3)挪威人 (4)德国人 (5)丹麦人。
基本要求:(1)根据a ~ d的要求以及1~15的条件编程实现问题求解;
(2)注意数据结构的选择,实物演示时要求讲出程序原理;
提高要求:(1)有很好的图形界面显示和较先进的算法;
(2)能将“房子-主人-饮料-香烟-饮料”的所有答案列出。
设计提示:本题答案唯一,一种常见的方法是根据给定条件用case或if语句穷举;此题数据结构的选取相当关键,数据结构选取失败将影响程序的实现;可以用递归来实现。
展开
 我来答
晴空的射手
2007-01-16 · TA获得超过142个赞
知道答主
回答量:217
采纳率:0%
帮助的人:0
展开全部
C#的程序

using System;
namespace netsafe.math
{
public class ayst
{
///
/// 问题中的所有元素
///
string[,] data= {{"黄房子", "蓝房子", "白房子", "红房子", "绿房子"},
{"挪威人", "英国人", "德国人", "丹麦人", "瑞典人"},
{"DUNHILL", "PRINCE", "混合烟", "PALL MALL", "BLUE MASTER"},
{"咖 啡", "矿泉水", "茶", "牛奶", " 啤酒 "},
{"鱼", " 恐龙", "马", "鸟", "狗"}};

///
/// answer用来存放答案
///
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();

}

}
}

}
}
}
///
/// 非常典型的用递归实现排列组合算法。
///
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--;
}
///
/// 写入all数组
///
void writeall()
{
int i;
for (i=1;i<=5;i++)
{
ALL[i,count]=List[i];
}
count++;
}
int find(int i,int j)
{
int k;
for(k=0;k<=5;k++)
{
if (answer[k,i]==j)
{
return k;
}
}
return -1;
}
///
/// 将答案打印出来
///
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();
}
}
}
说明:程序使用C#,在Microsoft Visual Studio.net下编译执行通过。如果你没有Microsoft Visual C# 需要安装Microsoft(r) .NET Framework SDK ,把上述代码保存到ayst.cs,然后在命令行模式下执行csc ayst.cs ,然后执行ayst.exe也可以
之友菱Nu
2007-01-16 · TA获得超过181个赞
知道小有建树答主
回答量:291
采纳率:0%
帮助的人:153万
展开全部
房 国 饮 烟 宠

黄 挪 水 DUNHILL 猫
蓝 丹 茶 BLENDS 马
红 英 奶 PALLMALL 鸟
绿 德 咖啡 PRINCE 鱼
白 瑞 啤酒 BLUE MASTER 狗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qixiahui
2007-01-16 · TA获得超过388个赞
知道小有建树答主
回答量:664
采纳率:100%
帮助的人:0
展开全部
呃~~~~其实解这到题要先从他们的房子入手~~~~~~~~~~~~~~
根据:9 挪威人住第一间房子,14 挪威人住在蓝房子旁边,1 英国人住在红房子里,4 绿房子在白房子左边。可以看出挪威人是住的第1间房子,第一间房子的旁边只能是第2间房子,所以可以知道第2间是蓝色房子,绿色房子在白色房子的左边,那么绿色房子只能是第3.4间。
8 住在中间那间房子的人喝牛奶,5 绿房子主人喝咖啡,可以看出第3间房子不是绿色房子,那么绿色房子便只能是第4间,白色的房子在它的右边,也就是第5座房子。
接下来再看第一座房子与第3座房子颜色,1 英国人住在红房子里,而第1座房子是挪威人的,所以得出英国人住的红房子在第3座。剩下的一座只有是挪威人住的黄色房子。
那么现在的顺序就是:1.黄色房子,2.蓝色房子,3.红色房子,4.绿色房子,5.白色房子。

推理出房子的顺序后其余的简单多了,最后是德国人在养鱼,详细的推理过程:http://post.baidu.com/f?kz=10301755你到这里面慢慢看吧~~~~

1、挪威人,黄色房子,Dunhill,喝矿泉水水,养猫
2、丹麦人,蓝色房子,混合烟,喝茶,养马
3、英国人,红色房子,Pall Mall ,喝牛奶,养鸟
4、德国人,绿色房子,Prince,喝咖啡,养鱼
5、瑞典人,白色房子,Blue Master,喝啤酒,养狗

参考资料: http://zhidao.baidu.com/question/13057815.html?fr=qrl3

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cf三个花
2014-08-18
知道答主
回答量:3
采纳率:0%
帮助的人:4254
展开全部
德国人养鱼
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式