鱼C论坛

 找回密码
 立即注册
查看: 2724|回复: 31

[已解决]来来来,小学三年级的题目有多少大人能做出来?

[复制链接]
发表于 2017-8-29 13:45:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

mmexport1503985191285.jpg
如果你能算出来,写个程序试试?
最佳答案
2017-8-30 15:17:07
本帖最后由 jerryxjr1220 于 2017-8-30 15:38 编辑
  1.    1  2  3  4  5  6  7  
  2. 向                1  
  3. 百 0  1             1
  4. 牡     1  0  1      
复制代码
   
上面这个凑乎 看一下  根据题  画出所有的
然后  根据 题里 关键的那一句  任何两种花 同时不开的日子 不超过一天   能判断出  所有标记为1的地方 都是开花
最后第一个条件 不能连续三天 开花 判断出 两个 为0的标记 这时就只剩礼拜五了
编程的话太麻烦了
  1. def by(n):  #变成二进制 10格式
  2.     return(str(bin(n+2**7)[3:]))
  3.    
  4. def cy(m):   #判断是否连续三天开放
  5.     y=0
  6.     g=True
  7.     for xxx in range(7):
  8.         if m[xxx] == "1":
  9.             y += 1
  10.             if y == 3:
  11.                 g = False
  12.                 break
  13.         else :
  14.             y =0
  15.     return(g)   

  16. for i in range (2**7):  #向日葵
  17.     a=by(i)
  18.     #二四日开放
  19.     if a[1] != "0" or a[3] != "0" or a[6] != "0" :
  20.         
  21.         continue
  22.    
  23.     for j in range (2**7):  #百合花
  24.         b=by(j)
  25.         #四六开放
  26.         if b[3] != "0" or b[5] != "0" :
  27.             continue
  28.         #多加一个  (日一二) 连续三天
  29.         if b[0] == b[1] == b[6] == "1":
  30.             continue
  31.         if not cy(b):
  32.             continue
  33.         for k in range (2**6):  #牡丹
  34.             #最后一天都不开
  35.             k=k*2
  36.             c=by(k)
  37.             if not cy(c):
  38.                 continue
  39.             aa=0
  40.             bb=0
  41.             cc=0
  42.             uu=True
  43.             #判断 没有超过一天 两朵同时不开
  44.             for xx in range(7):
  45.                 if a[xx] == b[xx] =="0":
  46.                     aa+=1
  47.                 if b[xx] == c[xx] =="0":
  48.                     bb+=1
  49.                 if c[xx] == a[xx] =="0":
  50.                     cc+=1
  51.                
  52.                 if aa ==2 or bb==2 or cc==2:
  53.                     uu=False
  54.                     continue
  55.             if uu == False:
  56.                 continue
  57.             #最后答案  同一天开放
  58.             for xx in range(7):
  59.                 if a[xx]==b[xx]==c[xx]== "1":
  60.                     print (a)
  61.                     print (b)
  62.                     print (c)
  63.                     print("星期%d"%(xx+1))
复制代码

                    

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-29 15:01:33 From FishC Mobile | 显示全部楼层
周一 然而代码真不会写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 15:11:22 | 显示全部楼层
s1dney 发表于 2017-8-29 15:01
周一 然而代码真不会写
  1. print("周一")
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 15:14:54 From FishC Mobile | 显示全部楼层
过客1993 发表于 2017-8-29 15:11

可以 这很皮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 15:44:03 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-8-29 15:48 编辑
s1dney 发表于 2017-8-29 15:01
周一 然而代码真不会写


周一是错的

你认为周一肯定是这样的情况:
  1. 向日葵 [1 0 1 0 1 1 0]
  2. 百合花 [1 1 0 0 1 0 1]
  3. 牡丹花 [1 1 0 1 0 1 0]
复制代码


然而,你要考虑到周日和周一、周二也是相连的3天,所以这个是不对的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 16:02:14 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2017-8-29 15:44
周一是错的

你认为周一肯定是这样的情况:

被你发现了
智商捉急真的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 16:13:42 | 显示全部楼层
周五
由(4),(5),(6)可知只剩1,3,5三天可能存在三种花同时开放
由(3),(4),(5)可知向日葵周六开,百合周二,周日开
再由(2)可知,百合周一不开,因此周一排除
由(3),(4),(6)可知牡丹周二,周四开
再由(2)可知,牡丹周三不开,因此周三排除,只剩周五
最后程序并不会写

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 推理正确!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 16:15:24 | 显示全部楼层
周三?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-8-29 17:32:10 | 显示全部楼层
ndndhy123 发表于 2017-8-29 16:13
周五
由(4),(5),(6)可知只剩1,3,5三天可能存在三种花同时开放
由(3),(4),(5)可知向日葵 ...

程序其实不难,我给个思路,利用itertools的product函数,穷举所有情况,然后利用条件排除不正确的,剩下的就是正确的解。
一周7天,3种花,每种花每天分为开和不开2种情况,也就是总共2**(3*7)大约200多万种情况,计算机解几乎是秒出的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 20:55:19 | 显示全部楼层
我怎么找到n多个符合条件的答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 21:01:12 | 显示全部楼层
本帖最后由 SixPy 于 2017-8-29 21:03 编辑
  1. import numpy as np

  2. def 条件2(arr):
  3.     ret= True
  4.     for row in range(3):
  5.         for col in range(7):
  6.             if np.sum(arr[row][col:col+3])==3:
  7.                 ret=False
  8.                 break
  9.     return ret
  10.    
  11. def 条件3(arr):
  12.     a=(np.sum(arr==0,0)>1)*1
  13.     a=np.hstack((a,a[0]))
  14.     return np.sum((a[:-1]+a[1:])==2)==0

  15. idx=(np.array([0, 0, 0, 1, 1, 2]), np.array([2, 4, 7, 4, 6, 7])-1)

  16. s = set()
  17. while len(s)<100:
  18.     arr=np.random.randint(0,2,3*7).reshape(3,7)
  19.     arr[idx]=0  # 条件 4、5、6

  20.     if (np.sum(np.sum(arr,0)==3)==1 # 条件1
  21.         and 条件2(np.hstack((arr,arr[:,:2])))
  22.         and 条件3(arr)):
  23.         b = str(arr)
  24.         if b not in s :
  25.             print(arr,len(s),sep='\n')
  26.         s.add(b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-29 22:54:00 | 显示全部楼层
SixPy 发表于 2017-8-29 20:55
我怎么找到n多个符合条件的答案?

那就是你算的不对,只有唯一解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 07:56:55 | 显示全部楼层
jerryxjr1220 发表于 2017-8-29 22:54
那就是你算的不对,只有唯一解。

3)在一周之内,任何两种花同时不开的日子不会超过一天;

这个条件如何理解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 08:12:00 | 显示全部楼层
SixPy 发表于 2017-8-30 07:56
3)在一周之内,任何两种花同时不开的日子不会超过一天;

这个条件如何理解?
  1. >>> arr
  2. array([[1, 0, 1, 0, 1, 1, 0],
  3.        [0, 1, 1, 0, 1, 0, 0],
  4.        [1, 1, 0, 0, 1, 1, 0]])
  5. >>> a=np.sum(arr==0,0) # 按列求 “不开”的个数
  6. >>> a
  7. array([1, 1, 1, 3, 0, 1, 3])
  8. >>> a=(a>1)*1  # 个数大于 1 种,也就是说 “任何两种花同时不开的日子”
  9. array([0, 0, 0, 1, 0, 0, 1])
  10. >>> a=np.hstack((a,a[0])) # 首尾相接
  11. array([0, 0, 0, 1, 0, 0, 1, 0])
  12. >>> a[:-1]+a[1:] # 错一位相加
  13. array([0, 0, 1, 1, 0, 1, 1])
  14. >>> np.sum((a[:-1]+a[1:])==2)==0 # 是否有连续2天都是“任何两种花同时不开的日子”
  15. True
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-30 09:12:54 | 显示全部楼层
SixPy 发表于 2017-8-30 07:56
3)在一周之内,任何两种花同时不开的日子不会超过一天;

这个条件如何理解?

就是任意2行的列里面同时为0的次数不能大于1.
我是先把数组转置了
  1.                 comb = np.array(each).reshape(3,7).T
  2.                 t1,t2,t3 = 0,0,0
  3.                 for l in range(7):
  4.                         t1 += 1 if comb[l,0]+comb[l,1]==0 else 0
  5.                         t2 += 1 if comb[l,1]+comb[l,2]==0 else 0
  6.                         t3 += 1 if comb[l,0]+comb[l,2]==0 else 0
  7.                 if t1<2 and t2<2 and t3<2:
  8.                         print(comb.T)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 09:27:19 | 显示全部楼层
jerryxjr1220 发表于 2017-8-30 09:12
就是任意2行的列里面同时为0的次数不能大于1.
我是先把数组转置了

我想多了
还以为是连续2天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 10:07:12 | 显示全部楼层
由条件456可以立刻得出同时开花在135这三天,百合花在2、7必开,牡丹在2、4必开,再结合条件2得出1、3不符合条件(连续超过三天),最后得到第五天同时开花
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 10:19:21 | 显示全部楼层
jerryxjr1220 发表于 2017-8-30 09:12
就是任意2行的列里面同时为0的次数不能大于1.
我是先把数组转置了

我觉得,条件3的描述还是有些模糊

应该说:
任意2种花,在一周之内只能有1天同时不开。


否定之否定的句式很难清晰地理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 11:00:09 | 显示全部楼层
我的程序代码如下:
声明a=向日葵,b=白百合,c=牡丹
for(a=1;a<=7;a++)     //三个for循环遍历三种花开的时间
{
     for(b=1;b<=7;b++)
     {
           for(b=1;b<=7;b++)
          {
                 if(!(a==2||a==4||a==7||b==4||b==6||c==7))//由条件可以判断花不可能在2467这四天开           
                  {
                           if(a==b&&b==c)
                              {
                                       if((4-c<3)&&(8+b-7<3))
                                       printf(“三种花在周%d同时开放!”,a);
                               }
                   }
           }
      }
}

这是我的思路。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-30 15:17:07 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jerryxjr1220 于 2017-8-30 15:38 编辑
  1.    1  2  3  4  5  6  7  
  2. 向                1  
  3. 百 0  1             1
  4. 牡     1  0  1      
复制代码
   
上面这个凑乎 看一下  根据题  画出所有的
然后  根据 题里 关键的那一句  任何两种花 同时不开的日子 不超过一天   能判断出  所有标记为1的地方 都是开花
最后第一个条件 不能连续三天 开花 判断出 两个 为0的标记 这时就只剩礼拜五了
编程的话太麻烦了
  1. def by(n):  #变成二进制 10格式
  2.     return(str(bin(n+2**7)[3:]))
  3.    
  4. def cy(m):   #判断是否连续三天开放
  5.     y=0
  6.     g=True
  7.     for xxx in range(7):
  8.         if m[xxx] == "1":
  9.             y += 1
  10.             if y == 3:
  11.                 g = False
  12.                 break
  13.         else :
  14.             y =0
  15.     return(g)   

  16. for i in range (2**7):  #向日葵
  17.     a=by(i)
  18.     #二四日开放
  19.     if a[1] != "0" or a[3] != "0" or a[6] != "0" :
  20.         
  21.         continue
  22.    
  23.     for j in range (2**7):  #百合花
  24.         b=by(j)
  25.         #四六开放
  26.         if b[3] != "0" or b[5] != "0" :
  27.             continue
  28.         #多加一个  (日一二) 连续三天
  29.         if b[0] == b[1] == b[6] == "1":
  30.             continue
  31.         if not cy(b):
  32.             continue
  33.         for k in range (2**6):  #牡丹
  34.             #最后一天都不开
  35.             k=k*2
  36.             c=by(k)
  37.             if not cy(c):
  38.                 continue
  39.             aa=0
  40.             bb=0
  41.             cc=0
  42.             uu=True
  43.             #判断 没有超过一天 两朵同时不开
  44.             for xx in range(7):
  45.                 if a[xx] == b[xx] =="0":
  46.                     aa+=1
  47.                 if b[xx] == c[xx] =="0":
  48.                     bb+=1
  49.                 if c[xx] == a[xx] =="0":
  50.                     cc+=1
  51.                
  52.                 if aa ==2 or bb==2 or cc==2:
  53.                     uu=False
  54.                     continue
  55.             if uu == False:
  56.                 continue
  57.             #最后答案  同一天开放
  58.             for xx in range(7):
  59.                 if a[xx]==b[xx]==c[xx]== "1":
  60.                     print (a)
  61.                     print (b)
  62.                     print (c)
  63.                     print("星期%d"%(xx+1))
复制代码

                    

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
jerryxjr1220 + 5 + 5 + 2 帮你改了下格式,用代码格式比较清楚。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表