1、在一条街上,有5座房子,喷了5种颜色。
2、每个房里住着不同国籍的人
3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
问题是:谁养鱼?
提示:
1、英国人住红色房子
2、瑞典人养狗
3、丹麦人喝茶
4、绿色房子在白色房子左面
5、绿色房子主人喝咖啡
6、抽Pall Mall 香烟的人养鸟
7、黄色房子主人抽Dunhill 香烟
8、住在中间房子的人喝牛奶
9、 挪威人住第一间房
10、抽Blends香烟的人住在养猫的人隔壁
11、养马的人住抽Dunhill 香烟的人隔壁
12、抽Blue Master的人喝啤酒
13、德国人抽Prince香烟
14、挪威人住蓝色房子隔壁
15、抽Blends香烟的人有一个喝水的邻居
为了便于消除翻译的误差,先将英文版本贴出(点击查看附件)
现在请你用c#写出解这个问题的程序!
相信不少人对此题的第一个想法是通过暴力算法穷举所有可能让计算机进行求解。如果是这样那么你不用辛苦了,下面早就有人这么干过了:
暴力算法解益智题[c#2.0版本](点击查看附件)
C#法解决世纪迷题(点击查看附件)
这些解法虽然都是对的,但是正如有人评论道:用笔解这题时候可比用程序看起来省力多了...算的上“轻松”吗?在这里向大家推荐人工智能工具NSolver (BY DR.Andy Chun, Hon Wai)。
用NSolver如何解决问题?
先举一个简单的例子:
IQ 题:
农场里有兔子和鸡若干只,知道共20个头和56条腿。问兔子和鸡各多少只?
用c#来解这个问题,可能是:
using System;
public class Rabbit
{
public int rabbit = 0;
public int pheasant = 0;
public void Run()
{
for (rabbit = 0; rabbit<=20; rabbit++)
for (pheasant = 0; pheasant<=20; pheasant++)
if (rabbit+pheasant==20
&& rabbit*4+pheasant*2==56)
Console.WriteLine(
"Rabbit["+rabbit+"] Pheasant["+pheasant+"]");
}
public static void Main() {(new Rabbit()).Run();}
}
有什么不足?
1、没有变量/未知量的概念
2、没有什么值合法什么不合法的概念(问题域)
3、没有变量间的关系/约束概念
4、所有都Hardcode了,不能扩展到更复杂的问题
5、暴力破解穷举
比较一下NSolver的解法:
using ai.net.Solver;
using System;
public class Rabbit : Solver
{
public Var rabbits, pheasants;
public void Run()
{
rabbits = var(0, 20, "Rabbits");
pheasants = var(0, 20, "Pheasants");
Post(rabbits.Sum(pheasants).Eq(20));
Post(rabbits.Prod(4).Sum(pheasants.Prod(2)).Eq(56));
Console.WriteLine(rabbits+" "+pheasants);
}
public static void Main() {(new Rabbit()).Run();}
}
现在用NSolver解决爱因斯坦问题(点击查看附件) [如有乱码,请点击浏览器工具栏"查看"-"编码"-"简体中文"]
看看这代码,简洁易懂! 现在你要做的就是陈述问题,NSolver帮你做剩下的!
延伸阅读
http://sc.info.gov.hk/gb/www.ugc.edu.hk/rgc/rgcnews9/Pages/6%20AI-C.html
NSolver的好处就是,它不仅仅能解决这个爱因斯坦的问题,它所能解决的是属于一个叫做“Constraint Satisfaction Problems”的一大堆问题。
更多文章请点击左边的“文章”和“存档”分类