最近看到一个比较老的题目,题目----在一条街上,有5座房子,喷了5种颜色,每个房里住着不同国籍的人,每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物,问题---谁养鱼?
以前没事还做过这个题,现在写个代码实现一下,还是感觉还是挺有意思的,先来看下推导条件吧:
1.英国人住红色房子2.瑞典人养狗3.丹麦人喝茶4.绿色房子在白色房子左面5.绿色房子主人喝咖啡6.抽PallMall香烟的人养鸟7.黄色房子主人抽Dunhill香烟8.住在中间房子的人喝牛奶9.挪威人住第一间房10.抽Blends香烟的人住在养猫的人隔壁11.养马的人住抽Dunhill香烟的人隔壁12.抽BlueMaster的人喝啤酒13.德国人抽Prince香烟14.挪威人住蓝色房子隔壁15.抽Blends香烟的人有一个喝水的邻居
自己开始做的时候在本子上推导的,就是画画改改,本来想拍图片的,这样就不用费劲了,鉴于本人字体需要提高,还是重新弄了几张图上来,简单说下推导过程:
1选择确定条件和不确定条件:
不确定条件:4.绿色房子在白色房子左面;8.住在中间房子的人喝牛奶;9.挪威人住第一间房;10.抽Blends香烟的人住在养猫的人隔壁;11.养马的人住抽Dunhill香烟的人隔壁;14.挪威人住蓝色房子隔壁;15.抽Blends香烟的人有一个喝水的邻居(特别说明:条件9和14算是确定条件,一号房是挪威人住,二号房是蓝色,不用画图,也不用推导,直接可以得出的结论,放在不确定里面是因为不好在确定条件里面展示)
2.条件推导
推导的步骤8,9,14(二号房是蓝色)→4,5(四号房是绿色,五号房是白色)→1,7(一号房是黄色,三号房是红色)→11(二号房养马),最后推导出的结果图如下:
3.这个时候剩下的条件:2,3,6,10,12,13,15,自己推导的时候在这里困扰了一下,像填字游戏一样,条件怎么弄进去感觉都是对的,观察了最后剩下的三种饮料:啤酒,茶,水,而且给出的条件比较多,3,12,15,条件3丹麦人喝茶,适用范围是二号房和五号房,假设丹麦人是五号房(走不通),丹麦人是二号房,接下来的事情就比较容易推导.(3,12,10,15,13,2,6==本人按照这个顺序推导的)
1.根据题目,创建一个包含房号,国家,颜色,饮料,宠物,香烟的Person类:
publicclassPerson{//房号publicintPosition{get;set;}//国家publicstringCountry{get;set;}//房子颜色publicstringColor{get;set;}//饮料publicstringDrink{get;set;}//香烟publicstringCigarette{get;set;}//宠物publicstringAnimal{get;set;}}2.去除所有的确定选项:
两种推导的方式思维其实还蛮不一样的,相对来说人工的需要自己的去按照自己经验,知识,去做出一些判断,在一些难点有自己的一套解决思路,比如说条件3丹麦人喝茶在自己推导的时候是一个难点,而在写程序的时候直接删除这种可能即可,写程序的时候我们需要先穷举出所有可能,就是很长的where语句那块,这一阶段弄明白了,应该都很明了。属于自己无意中看到的一个题目,属于编程的小乐趣吧,也可以算是Linq入门的一个小Demo吧~