鱼C论坛

 找回密码
 立即注册
查看: 3386|回复: 15

[技术交流] 小练习:20160425 在20×20的网格中同一直线上四个数的最大乘积是多少?

[复制链接]
发表于 2016-4-25 09:36:23 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2016-5-4 10:50 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了81道题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题,并且你每做对一题,就可以下载到参考答案的pdf文件,看看你的实现方法与参考答案有什么不同,以利于迅速提高自己的水平。


                               
登录/注册后可看大图

好了言归正传,我们开始做小练习。




题目要求:
以python语言完成,如果是python2请注明。
程序以代码文字格式发帖。
题目比较简单,注重程序效率和创意。
答题在5.4 10:00前完成,其后将公开大家的答案,并评比成绩。

另程序和答案可以在网上搜到,希望大家独立完成。


题目:

在以下这个 20×20 的网格中,四个处于同一对角线上的相邻数字用红色标了出来:

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

这四个数字的乘积是:26 × 63 × 78 × 14 = 1788696.

在这个 20×20 网格中,处于任何方向上(上,下,左,右或者对角线)的四个相邻数字的乘积的最大值是多少?


奖励:
对所有完成程序并得出正确答案的将给予加分奖励,优秀的将额外加分。
在完成一批题目后,将根据每期的完成情况总评评出最佳,会有神秘大奖。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2016-4-25 16:03:34 | 显示全部楼层
本帖最后由 詹姆西 于 2016-4-25 16:05 编辑

效率很低,凑合看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-25 16:04:28 | 显示全部楼层
  1. NUM='''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''
  21. NUM=NUM.replace('\n',' ')
  22. NUM=NUM.split(' ')
  23. NUM=int_num(NUM)
  24. COUNT=20

  25. def int_num(num):                 #将列表字符串,整数化
  26.     numlist=list()
  27.     for i in range(len(num)):
  28.         numlist.append(int(num[i]))
  29.     return numlist
  30.         
  31. def max_list(alist):            #求单一列表乘积的最大值
  32.     max_r=1
  33.     if len(alist)<4:
  34.         return(0)
  35.     else:
  36.         for i in range(0,len(alist)-3):
  37.             mul=alist[i]*alist[i+1]*alist[i+2]*alist[i+3]
  38.             if mul > max_r:
  39.                 max_r=mul
  40.         return(max_r)

  41. def list_r(num):        #将整个列表分割成小列表
  42.     alist=list()
  43.     for i in range(len(num)):
  44.         m = i % COUNT
  45.         if m == 0 :
  46.             temp=list()
  47.         temp.append(num[i])
  48.         if m == COUNT-1:
  49.             alist.append(temp)
  50.     return(alist)



  51. def list_d(num):        #将整个列表纵向分割成小列表
  52.     alist=list()
  53.     for i in range(COUNT):
  54.         temp=list()
  55.         for j in range(0,int(len(num)/COUNT)):
  56.             temp.append(num[i+j*COUNT])
  57.         alist.append(temp)
  58.     return(alist)

  59. def list_rd(num):         #将整个列表向右下方向分割成小列表
  60.     alist=list()
  61.     for i in range(COUNT):
  62.         j=i
  63.         temp=[num[i]]
  64.         while j+COUNT+1 < len(num) and (j+COUNT+1)% COUNT !=0:
  65.             temp.append(num[j+COUNT+1])
  66.             j+=COUNT+1
  67.         alist.append(temp)
  68.     for i in range(COUNT,len(num),COUNT):
  69.         j=i
  70.         temp=[num[i]]
  71.         while j+COUNT+1 < len(num) and (j+COUNT+1)%COUNT !=0:
  72.             j+=COUNT+1
  73.             temp.append(num[j])      
  74.         alist.append(temp)      
  75.     return(alist)
  76.             
  77. def list_lu(num):         #将整个列表向左上方向分割成小列表
  78.     alist=list()
  79.     for i in range(COUNT):
  80.         j=i
  81.         temp=[num[i]]
  82.         while j +COUNT-1 <len(num) and (j+COUNT-1) % COUNT !=(COUNT-1):
  83.             j+=COUNT-1
  84.             temp.append(num[j])
  85.         alist.append(temp)

  86.     for i in range(COUNT*2-1,len(num),COUNT):
  87.         j=i
  88.         temp=[num[i]]
  89.         while j+COUNT-1 <len(num) and (j+COUNT-1) %COUNT !=COUNT-1:
  90.             j+=COUNT-1
  91.             temp.append(num[j])
  92.         alist.append(temp)
  93.     return(alist)
  94.         

  95. def max_all(alist):
  96.     temp=0
  97.     for i in range(len(alist)):
  98.         if temp<max_list(alist[i]):
  99.             temp=max_list(alist[i])
  100.     return(temp)
  101.                

  102. max_r=max_all(list_r(NUM))
  103. max_d=max_all(list_d(NUM))
  104. max_rd=max_all(list_rd(NUM))
  105. max_lu=max_all(list_lu(NUM))
  106. max_all=max(max_r,max_d,max_rd,max_lu)

  107. print(max_all)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-4-25 18:39:06 | 显示全部楼层
想到应考虑去掉“00”上下左右相临为3位置再计算,但不知怎么入手,先整个全部计算的再说。
  1. str_input='''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''
  21. list_arrm=[]
  22. list_arrm_rel=[]

  23. for each in str_input.splitlines():
  24.     list_arrm.append((each.split(' ')))

  25. for i in range(0,17):
  26.     for j in range(0,17):
  27.         list_arrm_rel.append([int(list_arrm[i][j])*int(list_arrm[i+1][j+1])*int(list_arrm[i+2][j+2]),int(list_arrm[i+3][j+3]),int(list_arrm[i][j]),int(list_arrm[i+1][j+1]),int(list_arrm[i+2][j+2]),int(list_arrm[i+3][j+3])])

  28. for i in range(0,17):
  29.     for j in range(19,3,-1):
  30.         list_arrm_rel.append([int(list_arrm[i][j])*int(list_arrm[i+1][j-1])*int(list_arrm[i+2][j-2])*int(list_arrm[i+3][j-3]),int(list_arrm[i][j]),int(list_arrm[i+1][j-1]),int(list_arrm[i+2][j-2]),int(list_arrm[i+3][j-3])])

  31. for i in range(0,19):
  32.     for j in range(0,17):
  33.         list_arrm_rel.append([int(list_arrm[i][j])*int(list_arrm[i][j+1])*int(list_arrm[i][j+2])*int(list_arrm[i][j+3]),int(list_arrm[i][j]),int(list_arrm[i][j+1]),int(list_arrm[i][j+2]),int(list_arrm[i][j+3])])

  34. for i in range(0,17):
  35.     for j in range(0,19):
  36.         list_arrm_rel.append([int(list_arrm[i][j])*int(list_arrm[i+1][j])*int(list_arrm[i+2][j])*int(list_arrm[i+3][j]),int(list_arrm[i][j]),int(list_arrm[i+1][j]),int(list_arrm[i+2][j]),int(list_arrm[i+3][j])])

  37. print(max(list_arrm_rel)[:][0])
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-4-25 20:02:49 | 显示全部楼层
本帖最后由 挥舞乾坤 于 2016-4-25 20:07 编辑
  1. data = '''
  2.         08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  3.         49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  4.         81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  5.         52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  6.         22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  7.         24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  8.         32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  9.         67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  10.         24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  11.         21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  12.         78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  13.         16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  14.         86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  15.         19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  16.         04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  17.         88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  18.         04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  19.         20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  20.         20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  21.         01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
  22. '''
  23. data = data.split()
  24. lst = []
  25. for i in range(0, 20*20, 20):
  26.         lst.append(list(map(int, data[i:i+20])))

  27. r = set()
  28. for x in range(20):
  29.         for y in range(20):
  30.                 try:
  31.                         r.add(lst[x][y] * lst[x][y+1] * lst[x][y+2] * lst[x][y+3])
  32.                 except IndexError:
  33.                         pass
  34.                 try:
  35.                         r.add(lst[x][y] * lst[x+1][y+1] * lst[x+2][y+2] * lst[x+3][y+3])
  36.                 except IndexError:
  37.                         pass
  38.                 try:
  39.                         r.add(lst[x][y] * lst[x+1][y] * lst[x+2][y] * lst[x+3][y])
  40.                 except IndexError:
  41.                         pass
  42.                 try:
  43.                         r.add(lst[x][y] * lst[x-1][y+1] * lst[x-2][y+2] * lst[x-3][y+3])
  44.                 except IndexError:
  45.                         pass

  46. print(max(r))
复制代码


不够优雅,挺丑的

评分

参与人数 2荣誉 +7 鱼币 +7 贡献 +1 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^
bacon6581 + 2 + 2 + 1 学到map,try,字典了。

查看全部评分

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

使用道具 举报

发表于 2016-4-26 11:30:40 | 显示全部楼层
本帖最后由 lingtingliushen 于 2016-4-26 14:38 编辑
  1. str = '''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48''';
  21. a=[]
  22. b=[]
  23. i=0
  24. result=0
  25. s=0
  26. t=0

  27. for each in str.split():
  28.     a.append(int(each))

  29. for each1 in a:
  30.     for i in range(0,20):
  31.         b.append(a[i*20:(i+1)*20])

  32. for j in range(0,17):
  33.     for k in range(0,17):
  34.         A1=b[j][k]*b[j+1][k+1]*b[j+2][k+2]*b[j+3][k+3]
  35.         A2=b[j][k]*b[j][k+1]*b[j][k+2]*b[j][k+3]
  36.         A3=b[j][k]*b[j+1][k]*b[j+2][k]*b[j+3][k]
  37.         A4=b[j+3][k]*b[j+2][k+1]*b[j+1][k+2]*b[j][k+3]
  38.         A5=max(A1,A2,A3,A4)
  39.         if A5>result:
  40.             result=A5


  41. print(result)
复制代码

评分

参与人数 2荣誉 +7 鱼币 +7 贡献 +1 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^
bacon6581 + 2 + 2 + 1 代码简洁清晰,学习了!

查看全部评分

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

使用道具 举报

发表于 2016-4-26 11:31:13 | 显示全部楼层
  1. C:\Python34\python.exe C:/Users/guodongxue/PycharmProjects/untitled2/33.py
  2. 12 6 89 70600674
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-26 12:23:17 | 显示全部楼层
本帖最后由 bacon6581 于 2016-4-26 13:00 编辑

  1. num_str=[]

  2. #20x20 Num -> num_str

  3. for line in open('num.txt'):

  4.     num_str.append(line.split())

  5. num_int=[]

  6. for i in range(0,len(num_str)):

  7.     num_int_line=[]

  8.     for j in range(0,len(num_str[i])):

  9.         num_int_line.append(int(num_str[i][j]))

  10.     num_int.append(num_int_line)

  11. print(num_int)

  12. # \multiply
  13. result=0
  14. result_max=0
  15. list_max=[]

  16. for i in range(0,17):

  17.     for j in range(0,17):

  18.         result=num_int[i][j] * num_int[i+1][j+1] *
  19. num_int[i+2][j+2] * num_int[i+3][j+3]
  20.         if result > result_max:

  21.             result_max=result

  22.             list_max=num_int[i][j],num_int[i+1][j+1],num_int[i+2][j+2],num_int[i+3][j+3]

  23. # /multiply

  24. for i in range(3,17):

  25.     for j in range(0,17):

  26.         result=num_int[i][j] * num_int[i+1][j-1] * num_int[i+2][j-2] * num_int[i+3][j-3]
  27.         if result > result_max:

  28.             result_max=result

  29.             list_max=num_int[i][j],num_int[i+1][j-1],num_int[i+2][j-2],num_int[i+3][j-3]


  30. print("Max: {0}x{1}x{2}x{3}={4}".format(list_max[0],list_max[1],list_max[2],list_max[3],result_max))
复制代码

无标题.jpg
树莓派上写的程序,拖回到台式机,再更改后缀,最后调整段落(这步可能存在误操作)
可能直接复制到python里会报错
------------------------------------------------------------------------------------
原来我的思路和第6楼差不多。不过第6楼代码比我简洁、清晰多了。
我原以为只是两条对角线上的四个数字相乘,没有把横着、竖着的考虑进去
在树莓派里修改了下代码,结果还是一样样的。
第6楼,应该没考虑到前4个竖列,横着相乘、竖着相乘的结果
如下图:红色的6楼已经考虑了,蓝色的6楼还没考虑
无标题.jpg

评分

参与人数 2荣誉 +6 鱼币 +6 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^
lingtingliushen + 1 + 1 谢谢

查看全部评分

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

使用道具 举报

发表于 2016-4-26 13:46:18 | 显示全部楼层
bacon6581 发表于 2016-4-26 12:23
树莓派上写的程序,拖回到台式机,再更改后缀,最后调整段落(这步可能存在误操作)
可能直接复制到py ...
  1. str = '''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48''';
  21. a=[]
  22. b=[]
  23. i=0
  24. result=0
  25. s=0
  26. t=0

  27. for each in str.split():
  28.     a.append(int(each))

  29. for each1 in a:
  30.     for i in range(0,20):
  31.         b.append(a[i*20:(i+1)*20])

  32. for j in range(0,17):
  33.     for k in range(0,17):
  34.         A1=b[j][k]*b[j+1][k+1]*b[j+2][k+2]*b[j+3][k+3]
  35.         A2=b[j][k]*b[j][k+1]*b[j][k+2]*b[j][k+3]
  36.         A3=b[j][k]*b[j+1][k]*b[j+2][k]*b[j+3][k]
  37.         A4=b[j+3][k]*b[j+2][k+1]*b[j+1][k+2]*b[j][k+3]
  38.         A5=max(A1,A2,A3,A4)
  39.         if A5>result:
  40.             result=A5
  41.             s=j
  42.             t=k

  43. print(s,t,b[s][t],result)
  44. 感谢你指出来了,改了一下
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-26 18:59:32 | 显示全部楼层
  1. raw_string='''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''
  21. raw_string=raw_string.split('\n')
  22. num_list=[]
  23. for i in(raw_string):
  24.     num_list.append(i.split())
  25. for i in range(20):
  26.     for ii in range(20):
  27.         num_list[i][ii]=int(num_list[i][ii])
  28. maxx=0
  29. lenhang=len(num_list)
  30. lenlie=len(num_list[0])
  31. for i in range(lenhang):
  32.     for ii in range(lenlie-3):
  33.         su=sum(num_list[i][ii:ii+4])
  34.         if maxx<su:
  35.             maxx=su
  36. for i in range(lenlie):
  37.     for ii in range(lenhang-3):
  38.         su=sum([iii [i] for iii in num_list[ii:ii+4]])
  39.         if su>maxx:
  40.             maxx=su
  41. for i in range(lenhang-3):
  42.     for ii in range(lenlie-3):
  43.         su=sum([num_list[i+iii][ii+iii] for iii in range(4)])
  44.         if su>maxx:
  45.             maxx=su
  46. for i in range(4,lenhang):
  47.     for ii in range(0,lenlie-3):
  48.         su=sum([num_list[i-iii][ii+iii] for iii in range(4)])
复制代码

写得很丑,但是老师要我用c写五子棋,没时间多琢磨了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-26 23:29:23 | 显示全部楼层
  1. def max_sum(f):
  2.     sum = []
  3.     for i in range(0,17):
  4.         for j in range(0,17):
  5.             f1 = f[20*(i+0)+j]*f[20*(i+0)+j+1]*f[20*(i+0)+j+2]*f[20*(i+0)+j+3]
  6.             f2 = f[20*(i+1)+j]*f[20*(i+1)+j+1]*f[20*(i+1)+j+2]*f[20*(i+1)+j+3]
  7.             f3 = f[20*(i+2)+j]*f[20*(i+2)+j+1]*f[20*(i+2)+j+2]*f[20*(i+2)+j+3]
  8.             f4 = f[20*(i+3)+j]*f[20*(i+3)+j+1]*f[20*(i+3)+j+2]*f[20*(i+3)+j+3]
  9.             h1 = f[20*i+j+0]*f[20*(i+1)+j+0]*f[20*(i+2)+j+0]*f[20*(i+3)+j+0]
  10.             h2 = f[20*i+j+1]*f[20*(i+1)+j+1]*f[20*(i+2)+j+1]*f[20*(i+3)+j+1]
  11.             h3 = f[20*i+j+2]*f[20*(i+1)+j+2]*f[20*(i+2)+j+2]*f[20*(i+3)+j+2]
  12.             h4 = f[20*i+j+3]*f[20*(i+1)+j+3]*f[20*(i+2)+j+3]*f[20*(i+3)+j+3]
  13.             p1 = f[20*(i+0)+j]*f[20*(i+1)+j+1]*f[20*(i+2)+j+2]*f[20*(i+3)+j+3]
  14.             p2 = f[20*(i+3)+j]*f[20*(i+2)+j+1]*f[20*(i+1)+j+2]*f[20*(i+0)+j+3]
  15.             list_lis = [f1,f2,f3,f4,h1,h2,h3,h4,p1,p2]
  16.             res1 = max(list_lis)
  17.             sum.append(res1)
  18.     print(max(sum))

  19. import time

  20. flist = '''
  21. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  22. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  23. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  24. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  25. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  26. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  27. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  28. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  29. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  30. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  31. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  32. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  33. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  34. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  35. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  36. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  37. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  38. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  39. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  40. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
  41. '''
  42. time_s = time.time()
  43. flist = flist.split()
  44. for i in range(0,400):
  45.     flist[i] = int(flist[i])

  46. max_sum(flist)
  47. print(time.time() - time_s)
复制代码


结果:70600674
用时:0.0792398452759

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-4-27 01:36:36 | 显示全部楼层
  1. data = '''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''

  21. lst = [list(map(int,list(line.split(' ')))) for line in data.split('\n')]
  22. size,maxi  = len(lst),0
  23. for i in range(size-3):
  24.     for j in range(size-3):
  25.         maxi = max(maxi,lst[j][i]*lst[j][i+1]*lst[j][i+2]*lst[j][i+3],
  26.                         lst[j][i]*lst[j+1][i]*lst[j+2][i]*lst[j+3][i],
  27.                         lst[j][i]*lst[j+1][i+1]*lst[j+2][i+2]*lst[j+3][i+3],
  28.                         lst[j+3][i]*lst[j+2][i+1]*lst[j+1][i+2]*lst[j][i+3])
  29. print(maxi)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-4-27 20:37:59 | 显示全部楼层
应为python才刚学不久,所以只能用一些刚学会的语句尝试,
我算了一下,两三秒左右出结果。
  1. product=0#用于存放乘积
  2. wangge="""08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  3. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  4. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  5. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  6. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  7. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  8. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  9. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  10. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  11. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  12. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  13. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  14. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  15. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  16. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  17. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  18. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  19. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  20. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  21. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"""#把表格定义为分行字符串
  22. a=wangge.splitlines()#将整个表格先切片成以行为元素的列表。
  23. i=0
  24. d=3
  25. while i<len(a):#判断行当中的最大值
  26.     while d<20:
  27.         if product<int(a[i].split()[d])*int(a[i].split()[d-1])*int(a[i].split()[d-2])*int(a[i].split()[d-3]):
  28.             product=int(a[i].split()[d])*int(a[i].split()[d-1])*int(a[i].split()[d-2])*int(a[i].split()[d-3])
  29.         d+=1
  30.     d=3
  31.     i+=1
  32. d=0
  33. i=3
  34. while d<len(a):#判断列的最大值
  35.     while i<20:
  36.         if product<int(a[i].split()[d])*int(a[i-1].split()[d])*int(a[i-2].split()[d])*int(a[i-3].split()[d]):
  37.             product=int(a[i].split()[d])*int(a[i-1].split()[d])*int(a[i-2].split()[d])*int(a[i-3].split()[d])
  38.         i+=1
  39.     d+=1
  40.     i=3
  41. i=0
  42. d=0
  43. while d+3<len(a):#判断左上到右下对角线的最大
  44.     while i+3<20:
  45.         if product<int(a[i].split()[d])*int(a[i+1].split()[d+1])*int(a[i+2].split()[d+2])*int(a[i+3].split()[d+3]):
  46.             product=int(a[i].split()[d])*int(a[i+1].split()[d+1])*int(a[i+2].split()[d+2])*int(a[i+3].split()[d+3])
  47.         i+=1
  48.     d+=1
  49.     i=0
  50. i=0
  51. d=3
  52. while d<len(a):#判断从右上到坐下的最大
  53.     while i+3<20:
  54.         if product<int(a[i].split()[d])*int(a[i+1].split()[d-1])*int(a[i+2].split()[d-2])*int(a[i+3].split()[d-3]):
  55.             product=int(a[i].split()[d])*int(a[i+1].split()[d-1])*int(a[i+2].split()[d-2])*int(a[i+3].split()[d-3])
  56.         i+=1
  57.     d+=1
  58.     i=0
  59. print(product)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-4-30 20:53:33 | 显示全部楼层
本帖最后由 zooo 于 2016-5-4 00:08 编辑

思路:根据题意数组中每个元素都有4个方向
oula20思路.png
定义一个函数用来找出每个元素在这4个方向的最大值,遍历整个矩阵后找出最终结果

  1. from functools import reduce
  2. import time

  3. def find_max_eachElem(numArr, x, y):
  4.     aspect = [[], [], [], []]#对数组中每个元素的四个方向初始化
  5.    
  6.     for i in range(4):
  7.         if 0<= y+i <20:
  8.             aspect[0].append(numArr[x][y+i])#右
  9.         else:aspect[0].append(0)

  10.         if 0<= x + i <20 and 0<= y + i <20:
  11.             aspect[1].append(numArr[x + i][y + i])#右下
  12.         else:aspect[1].append(0)
  13.         
  14.         if 0<= x+i <20:
  15.             aspect[2].append(numArr[x + i][y])#下
  16.         else:aspect[2].append(0)

  17.         if 0<= x - i and 0<= y + i <20:
  18.             aspect[3].append(numArr[x - i][y + i])#左下
  19.         else:aspect[3].append(0)

  20.     max, maxArr = 0, []
  21.     for arr in aspect:
  22.         tmp = reduce(lambda x, y:x*y, arr)
  23.         if tmp > max:
  24.             max, maxArr = tmp, arr
  25.             
  26.     return (max, maxArr)

  27. s = time.time()

  28. str_num = '''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  29. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  30. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  31. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  32. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  33. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  34. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  35. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  36. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  37. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  38. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  39. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  40. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  41. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  42. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  43. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  44. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  45. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  46. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  47. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''

  48. numArr = list(map(lambda x:list(map(lambda y:int(y), x.split())), str_num.split('\n')))

  49. max = 0
  50. for x in range(20):
  51.     for y in range(20):
  52.         if numArr[x][y]: #跳过0
  53.             result = find_max_eachElem(numArr, x, y)
  54.             if result[0] > max:
  55.                 (max, maxArr) = result

  56. print(max, maxArr, time.time()-s)
复制代码


并行代码(使用pp模块),由于计算规模太小效率反而下降了,实验计算400x400的数组效率明显提升
并行计算数组400x400.zip (171.36 KB, 下载次数: 0)
  1. import pp
  2. import functools

  3. def find_max_eachElem(numArr, x, y):
  4.     aspect = [[], [], [], []]#对数组中每个元素的四个方向初始化
  5.    
  6.     for i in range(4):
  7.         if 0<= y+i <20:
  8.             aspect[0].append(numArr[x][y+i])#右
  9.         else:aspect[0].append(0)

  10.         if 0<= x + i <20 and 0<= y + i <20:
  11.             aspect[1].append(numArr[x + i][y + i])#右下
  12.         else:aspect[1].append(0)
  13.         
  14.         if 0<= x+i <20:
  15.             aspect[2].append(numArr[x + i][y])#下
  16.         else:aspect[2].append(0)

  17.         if 0<= x - i and 0<= y + i <20:
  18.             aspect[3].append(numArr[x - i][y + i])#左下
  19.         else:aspect[3].append(0)

  20.     max, maxArr = 0, []
  21.     for arr in aspect:
  22.         tmp = functools.reduce(lambda x, y:x*y, arr)
  23.         if tmp > max:
  24.             max, maxArr = tmp, arr
  25.             
  26.     return (max, maxArr)

  27. def findMax(numArr, beg, end):
  28.     max = 0
  29.     for x in range(beg, end):
  30.         for y in range(20):
  31.             if numArr[x][y]: #跳过0
  32.                 result = find_max_eachElem(numArr, x, y)
  33.                 if result[0] > max:
  34.                     (max, maxArr) = result
  35.     return (max, maxArr)

  36. str_num = '''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  37. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  38. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  39. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  40. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  41. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  42. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  43. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  44. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  45. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  46. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  47. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  48. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  49. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  50. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  51. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  52. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  53. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  54. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  55. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''

  56. numArr = list(map(lambda x:list(map(lambda y:int(y), x.split())), str_num.split('\n')))

  57. funList = []
  58. #开启pp服务
  59. job_server = pp.Server(ncpus=2)#使用2个核心

  60. #分4段
  61. parts = 4
  62. step = 20//4
  63. for index in range(4):
  64.     funList.append(job_server.submit(findMax, (numArr, index*step, (index+1)*step),
  65.                       (find_max_eachElem, ), ('functools', ) ))

  66. listResults = []

  67. for fun in funList:
  68.     listResults.append(fun())

  69. dictResults = dict(listResults)

  70. job_server.print_stats()

  71. maxNum = max(dictResults.keys())
  72. print(maxNum, dictResults[maxNum])

复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-4 00:42:02 | 显示全部楼层


  1. def hmax(array):
  2.     result=0
  3.     relist=[]
  4.     for i in range(len(array)):
  5.             for j in range(len(array[i])):
  6.                 try:
  7.                     temp=array[i][j]*array[i][j+1]*array[i][j+2]*array[i][j+3]
  8.                     if temp>result:
  9.                         result=temp
  10.                         relist=[array[i][j],array[i][j+1],array[i][j+2],array[i][j+3]]
  11.                 except:pass
  12.    
  13.     return result,relist

  14. def vmax(array):
  15.     result=0
  16.     relist=[]
  17.     for i in range(len(array)):
  18.                 for j in range(len(array[i])):
  19.                     try:
  20.                         temp=array[i][j]*array[i+1][j]*array[i+2][j]*array[i+3][j]
  21.                         if temp>result:
  22.                             result=temp
  23.                             relist=[array[i][j],array[i+1][j],array[i+2][j],array[i+3][j],i,j]
  24.                     except:pass
  25.     return result,relist

  26. def drmax(array):
  27.     result=0
  28.     relist=[]
  29.     for  i in range(len(array)):
  30.                     for j in range(len(array[i])):
  31.                         try:
  32.                             temp=array[i][j]*array[i+1][j+1]*array[i+2][j+2]*array[i+3][j+3]
  33.                             if temp>result:
  34.                                 result=temp
  35.                                 relist=[array[i][j],array[i+1][j+1],array[i+2][j+2],array[i+3][j+3]]
  36.                         except:pass
  37.     return result,relist

  38. def dlmax(array):
  39.     result=0
  40.     relist=[]
  41.     for  i in range(len(array)-1,0,-1):
  42.                     for j in range(len(array[i])):
  43.                         try:
  44.                             temp=array[i][j]*array[i-1][j+1]*array[i-2][j+2]*array[i-3][j+3]
  45.                             if temp>result:
  46.                                 result=temp
  47.                                 relist=[array[i][j],array[i-1][j+1],array[i-2][j+2],array[i-3][j+3]]
  48.                         except:pass

  49.     return result,relist

  50. def maxprint(hmax):
  51.     print('四个相邻的数字的乘积最大的是:\n','%dx%dx%dx%d=%d'%(hmax[1][0],hmax[1][1],hmax[1][2],hmax[1][3],temp))

  52.    
  53. hub='''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  54. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  55. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  56. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  57. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  58. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  59. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  60. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  61. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  62. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  63. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  64. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  65. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  66. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  67. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  68. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  69. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  70. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  71. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  72. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''

  73. line=list(hub.split())
  74. array=[]
  75. k=0
  76. for i in range (0,20):
  77.     array.append ([])
  78.     for j in range (0,20):
  79.         array[i].append(int(line[k]))
  80.         k+=1
  81.    

  82. hmax=hmax(array)
  83. vmax=vmax(array)
  84. drmax=drmax(array)
  85. dlmax=dlmax(array)

  86. temp=max(hmax[0],vmax[0],drmax[0],dlmax[0])
  87. if temp==hmax[0]:
  88.     maxprint(hmax)
  89. elif temp==vmax[0]:
  90.     maxprint(vmax)
  91. elif temp==drmax[0]:
  92.     maxprint(drmax)
  93. else:
  94.     maxprint(dlmax)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-4 09:45:05 | 显示全部楼层
本帖最后由 DingRan 于 2016-5-4 11:00 编辑

严重支持
  1. txt = '''08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
  2. 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
  3. 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
  4. 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
  5. 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
  6. 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
  7. 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
  8. 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
  9. 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
  10. 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
  11. 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
  12. 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
  13. 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
  14. 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
  15. 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
  16. 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
  17. 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
  18. 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
  19. 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
  20. 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'''

  21. def trans(i,j):
  22.     return 20*(i-1)+j-1

  23. def heng(i,j):
  24.     if j>17:
  25.         return 0
  26.     return num[trans(i,j)]*num[trans(i,j+1)]*num[trans(i,j+2)]*num[trans(i,j+3)]

  27. def zong(i,j):
  28.     if i>17:
  29.         return 0
  30.     return num[trans(i,j)]*num[trans(i+1,j)]*num[trans(i+2,j)]*num[trans(i+3,j)]

  31. def youxie(i,j):
  32.     if i>17 or j>17:
  33.         return 0
  34.     return num[trans(i,j)]*num[trans(i+1,j+1)]*num[trans(i+2,j+2)]*num[trans(i+3,j+3)]

  35. def zuoxie(i,j):
  36.     if j<4 or i>17:
  37.         return 0
  38.     return num[trans(i,j)]*num[trans(i+1,j-1)]*num[trans(i+2,j-2)]*num[trans(i+3,j-3)]

  39. num = []
  40. for i in range(400):
  41.     num.append(int(txt[3*i:3*i+2]))

  42. max_product = 0

  43. for i in range(1,21):
  44.     for j in range(1,21):
  45.         if heng(i,j)>max_product:
  46.             max_product = heng(i,j)
  47.         if zong(i,j)>max_product:
  48.             max_product = zong(i,j)
  49.         if youxie(i,j)>max_product:
  50.             max_product = youxie(i,j)
  51.         if zuoxie(i,j)>max_product:
  52.             max_product = zuoxie(i,j)

  53. print(max_product)
复制代码

运行结果
  1. >>>
  2. 70600674
  3. >>>
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 08:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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