問題:
1、在一條街上号涯,有5座房子目胡,噴了5種顏色。
2诚隙、每間房里住著不同國籍的人
3讶隐、每個人喝不同的飲料,抽不同品牌的香煙久又,養(yǎng)不同的寵物
問題是:誰養(yǎng)魚巫延?
提示:
1、英國人住紅色房子
2地消、瑞典人養(yǎng)狗
3炉峰、丹麥人喝茶
4、綠色房子在白色房子左面
5脉执、綠色房子主人喝咖啡
6疼阔、抽Pall Mall 香煙的人養(yǎng)鳥
7、黃色房子主人抽Dunhill 香煙
8半夷、住在中間房子的人喝牛奶
9婆廊、 挪威人住第一間房
10、抽Blends香煙的人住在養(yǎng)貓的人隔壁
11巫橄、養(yǎng)馬的人住抽Dunhill 香煙的人隔壁
12淘邻、抽Blue Master的人喝啤酒
13、德國人抽Prince香煙
14湘换、挪威人住藍色房子隔壁
15宾舅、抽Blends香煙的人有一個喝水的鄰居
解決:
五種屬性,每種五個彩倚,全排列一共 (5!)^5 = 24883200000種筹我,用挪威住第一個,藍色是挪威隔壁帆离,牛奶在中間蔬蕊,綠色在白色左邊,剔除掉一些哥谷,剩余99532800袁串,把問題縮小到可接受的范圍概而。
上python,itertools的permutations可以生成全排列囱修,自定義一個函數(shù)轉(zhuǎn)換tuple為list,剔除之后加循環(huán)判斷王悍。
兩種條件:
xx的人也yy破镰,說明xx和yy在各自列表中的位置相同
xx的人有個yy的鄰居,說明xx和yy在各自列表中的索引相差1
答案:
程序:
一開始用dict压储,國籍作為key鲜漩,其余屬性設置為一個list,作為key的value集惋,跑起來之后發(fā)現(xiàn)dict是按照字母排序的孕似,換list。
刪除list的時候不能在循環(huán)的時候刪除刮刑,這樣會導致循環(huán)長度變化喉祭。應該是把要刪除的append到一個臨時列表,然后遍歷這個臨時的list雷绢。
QPython 在安卓上2分鐘左右能跑出來泛烙。