|
发表于 2017-9-6 23:46:56
|
显示全部楼层
本帖最后由 kio 于 2017-9-7 08:54 编辑
用FOR循环来解题的,我个人的看法,是错的.虽然也能算出答案,但思维方式不对.
这么简单的题,我想了一个星期才想出来.
答案是一早推出来了,但抽象成程序,有点难.
- import pandas as pd
- week = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
- Flowers_Boolm_Day = {}
- #向日葵,二、四、日不开花 (False表示不开花,True表示未确定开花或不开花)
- Flowers_Boolm_Day["Sun"] = [False,True,False,True,False,True,True]
- #百合,四、六不开花
- Flowers_Boolm_Day["Lily"] = [True,True,True,True,False,True,False]
- #牡丹,周日不开花
- Flowers_Boolm_Day["Peony"] = [False,True,True,True,True,True,True]
- df=pd.DataFrame(data=Flowers_Boolm_Day,index=week)
- df=df.applymap(lambda x:0 if x==True else -1) #1表示开花,0表示不确定,-1表示不开花.
-
- def cheack_same_day():
- global df
- df["lp"]=df["Lily"]+df["Peony"]
- df["ls"]=df["Lily"]+df["Sun"]
- df["sp"]=df["Sun"]+df["Peony"]
- #统计有多少天
- df["undefine"]=df.apply(lambda x:len(x[:3][x==0]),axis=1)
- #定义任何两种花同时不开花不能超过一天,统计同一天不开花的时间,如果-2则表示同一天不开化
- #比较两组数据,x,y
- def compare_LeftRight(s,x,y):
- if s[x]==0 and s[y]==-1:
- s[x]=1
- elif s[x]==-1 and s[y]==0:
- s[y]=1
- return s
- #横向填空
- def fill_x():
- cheack_same_day()#更新数据,保证是最新数据
- global df
- if -2 in df["lp"].values:
- df = df.apply(compare_LeftRight,axis=1,args=("Lily","Peony"))
- if -2 in df["ls"].values:
- df = df.apply(compare_LeftRight,axis=1,args=("Lily","Sun"))
- if -2 in df["sp"].values:
- df = df.apply(compare_LeftRight,axis=1,args=("Sun","Peony"))
- cheack_same_day()#更新数据,保证是最新数据
- #定义没有一种花能连续开三天(每种花最多只能开两天)
- def compare_UpDown(s):
- """
- 1.找到未确定的位置,(一个字符串列表)
- 2.循环列表
- 3.对比上下
- """
- undefines = s[s==0]
- for i in undefines.index:
- if s.shift(-1)[i]==1 and s.shift(1)[i]==1:
- s[i]=-1
- return s
- #竖向填空
- def fill_y():
- cheack_same_day()#更新数据,保证是最新数据
- global df
- df = df.apply(compare_UpDown,axis=0)
- cheack_same_day()#更新数据,保证是最新数据
- #主函数,判断是否同一天开花
- def cheack_only():
- cheack_same_day()
- zeros_ = len(df[df["undefine"]==3])
- if zeros_ == 1:
- print("同一天开花的时间是:%s" % df[df["undefine"]==3].index[0])
- return df[df["undefine"]==3].index
- fill_x()
- fill_y()
- cheack_same_day()
- print("有可能的目标还有%d个"%zeros_)
- return cheack_only()
- if __name__ == "__main__":
- cheack_only()
复制代码
前面发过一个回复,当时的思路还比较混乱.
分析下思路,首先把这个花期,抽象成一张表格,
- Lily Peony Sun
- Sunday unknow fall fall
- Monday unknow unknow unknow
- Tuesday unknow unknow fall
- Wednesday unknow unknow unknow
- Thursday fall unknow fall
- Friday unknow unknow unknow
- Saturday fall unknow unknow
复制代码
然后,我们来深入一些.
把开花定义为1,不开花定义为-1,不知道开不开花的定义为0
我们就再得到了一张表:- Lily Peony Sun
- Sunday 0 -1 -1
- Monday 0 0 0
- Tuesday 0 0 -1
- Wednesday 0 0 0
- Thursday -1 0 -1
- Friday 0 0 0
- Saturday -1 0 0
复制代码
跟着我们把这个表扩展一下,增加几个属性,
主要是用来描述,两种花有没有在同一天不开花,
lp是Lily和Peony的和,如果产生了一个-2的值,就说明这一天,两种花都同是开花了,-1则只知道有一种花没开,0表示全不知道
ls,sp分别对应Lily+Sun和Sun+Peony
- Lily Peony Sun lp ls sp undefine
- Sunday 0 -1 -1 -1 -1 -2 1
- Monday 0 0 0 0 0 0 3
- Tuesday 0 0 -1 0 -1 -1 2
- Wednesday 0 0 0 0 0 0 3
- Thursday -1 0 -1 -1 -2 -1 1
- Friday 0 0 0 0 0 0 3
- Saturday -1 0 0 -1 -1 0 2
复制代码
因为条件3,对其它项目的影响不大,而且条件最明确,所以我们先来个横填空.
- Lily Peony Sun lp ls sp undefine
- Sunday 1 -1 -1 0 0 -2 0
- Monday 0 0 0 0 0 0 3
- Tuesday 1 1 -1 2 0 0 0
- Wednesday 0 0 0 0 0 0 3
- Thursday -1 1 -1 0 -2 0 0
- Friday 0 0 0 0 0 0 3
- Saturday -1 0 1 -1 0 1 1
复制代码
满足了条件3后,填条件2的时机也成熟了.
- Lily Peony Sun lp ls sp undefine
- Sunday 1 -1 -1 0 0 -2 0
- Monday -1 0 0 -1 -1 0 2
- Tuesday 1 1 -1 2 0 0 0
- Wednesday 0 -1 0 -1 0 -1 2
- Thursday -1 1 -1 0 -2 0 0
- Friday 0 0 0 0 0 0 3
- Saturday -1 0 1 -1 0 1 1
复制代码
填完了这里,我们就可以判断出,唯一可能乎合条件的就只能是星期五了,没错,是可能.
这里有个问题,在这个题目里,各位条件给的很到位,填一遍就能算出答案了.
但如果这个条件变一下,就会发现,横向填完,竖向的条件就变了,填完竖向,横向的条件也跟着发生变化了.
它们是两个互相影响的关系.在更多不确实的条件下,要不断的去循环这两步的工作,就像玩数独一样.
在这里就要用到递归的算法来解决了.
咱们玩个接龙游戏,我也出一题.
分别在格子中填入1到9的数字,并满足下面的条件。
1.每一行都用到1,2,3,4,5,6,7,8,9
2.每一列都用到1,2,3,4,5,6,7,8,9
3.每3×3的格子都用到1,2,3,4,5,6,7,8,9
用程序来写吧. |
|