问题:
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香烟的人有一个喝水的邻居
解决:
五种属性,每种五个,全排列一共 (5!)^5 = 24883200000种,用挪威住第一个,蓝色是挪威隔壁,牛奶在中间,绿色在白色左边,剔除掉一些,剩余99532800,把问题缩小到可接受的范围。
上python,itertools的permutations可以生成全排列,自定义一个函数转换tuple为list,剔除之后加循环判断。
两种条件:
xx的人也yy,说明xx和yy在各自列表中的位置相同
xx的人有个yy的邻居,说明xx和yy在各自列表中的索引相差1
答案:
程序:
一开始用dict,国籍作为key,其余属性设置为一个list,作为key的value,跑起来之后发现dict是按照字母排序的,换list。
删除list的时候不能在循环的时候删除,这样会导致循环长度变化。应该是把要删除的append到一个临时列表,然后遍历这个临时的list。
QPython 在安卓上2分钟左右能跑出来。