QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

版主

Rank: 20Rank: 20Rank: 20Rank: 20

技术值
查看: 575|回复: 22

[技术交流] Python:每日一题 151

[复制链接]
最佳答案
591 
累计签到:776 天
连续签到:17 天
冬雪雪冬 发表于 2018-2-9 09:42:45 57522 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
本帖最后由 冬雪雪冬 于 2018-2-14 20:19 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
在九宫格中填入0~8共9个数字,例如:
0.jpg

我们发现,三行从左往右值是递增的
1.jpg

三列也是
2.jpg

三条斜线也是(左上到右下和右上到左下)
3.jpg

4.jpg

满足这些要求的排列都有哪些呢?
以这样的输出表示:
  1. 0 1 2
  2. 3 4 5
  3. 6 7 8
复制代码



本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
30 
累计签到:35 天
连续签到:3 天
冰封雪舞 发表于 2018-2-9 10:26:59 | 显示全部楼层
本帖最后由 冰封雪舞 于 2018-2-9 10:31 编辑

进过反复推敲,因为只有0-8这9个数字,因为只有9个数字,所以你每一行只要随便换一个数字位置,第二幅图片都无法满足,只能整行换,而整行换的话第三幅图片又给限制死了,所以只有一种排列方法。
最佳答案
1 
累计签到:29 天
连续签到:4 天
shigure_takimi 发表于 2018-2-9 10:42:45 From FishC Mobile | 显示全部楼层
  1. #!/usr/bin/python
  2. from itertools import permutations

  3. for i in permutations(list(range(9)),9):
  4.         if i[0]<i[1]<i[2] and i[3]<i[4]<i[5] and i[6]<i[7]<i[8]\
  5.         and i[0]<i[3]<i[6] and i[1]<i[4]<i[7] and i[2]<i[5]<i[8]\
  6.         and i[0]<i[4]<i[8] and i[1]<i[5] and i[3]<i[7]\
  7.         and i[2]<i[4]<i[6] and i[1]<i[3] and i[5]<i[7]:
  8.                 print(i[0],i[1],i[2])
  9.                 print(i[3],i[4],i[5])
  10.                 print(i[6],i[7],i[8])
  11.                 print()

  12. ##  没有什么好办法,and用太多了
  13. ##  算出来有4种组合。

  14. 0 1 2
  15. 3 4 5
  16. 6 7 8

  17. 0 1 2
  18. 3 4 6
  19. 5 7 8

  20. 0 1 3
  21. 2 4 5
  22. 6 7 8

  23. 0 1 3
  24. 2 4 6
  25. 5 7 8
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
6 
累计签到:40 天
连续签到:15 天
大头目 发表于 2018-2-9 11:49:00 | 显示全部楼层
#太暴力了,要跑好久,辛苦版主!向大家请教学习更好的方法!

for a0 in range(9):
        for a1 in range(9):
                for a2 in range(9):
                        for a3 in range(9):
                                for a4 in range(9):
                                        for a5 in range(9):
                                                for a6 in range(9):
                                                        for a7 in range(9):
                                                                for a8 in range(9):
                                                                        #如果格子内数字可以重复,请把下面一行删除,然后整体缩进一层
                                                                        if a0 != a1 != a2 != a3 != a4 != a5 != a6 != a7 != a8:
                                                                                if a2 > a1> a0 and a5 > a4 > a3 and a8 > a7 > a6:
                                                                                        if a6 > a3> a0 and a7 > a4 > a1 and a8 > a5 > a2:
                                                                                                if a5 > a1 and a8 > a4 > a0 and a7 > a3 :
                                                                                                        if a7 > a5 and a6 > a4 > a2 and a3 > a1 :
                                                                                                                list1 = [a0,a1,a2]
                                                                                                                list2 = [a3,a4,a5]
                                                                                                                list3 = [a6,a7,a8]
                                                                                                                print(list1)
                                                                                                                print(list2)
                                                                                                                print(list3)
                                                                                                                print('我是分割线--------------')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
2 
累计签到:21 天
连续签到:21 天
inverseli 发表于 2018-2-9 12:16:05 | 显示全部楼层
  1. import operator
  2. def list1():
  3.     for a in range(0,9):
  4.         for b in range(1,9):
  5.             for c in range(1,9):
  6.                 if a<b and b<c:
  7.                     yield([a,b,c])
  8. def list2():
  9.     for a in range(0,9):
  10.         for b in range(1,9):
  11.             for c in range(1,9):
  12.                 if a<b and b<c:
  13.                     yield([a,b,c])
  14. def list3():
  15.     for a in range(0,9):
  16.         for b in range(1,9):
  17.             for c in range(1,9):
  18.                 if a<b and b<c:
  19.                     yield([a,b,c])
  20. for i in list1():
  21.     for j in list2():
  22.         for k in list3():
  23.             if i[0] not in j and i[1] not in j and i[2] not in j:
  24.                 if i[0] not in k and i[1] not in k and i[2] not in k:
  25.                     if j[0] not in k and j[1] not in k and j[2] not in k:
  26.                         if i[0]<j[1] and i[1]<j[2] and j[0]<k[1] and j[1]<k[2]:
  27.                             if i[1]<j[0] and i[2]<j[1] and j[1]<k[0] and j[2]<k[1]:
  28.                                 if operator.lt(i,j) and operator.lt(j,k):
  29.                                     print(i,j,k)
  30.                
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
6 
累计签到:86 天
连续签到:1 天
U201010009 发表于 2018-2-9 14:58:40 | 显示全部楼层
  1. '''
  2.     list9个元素,左到右验证
  3. '''
  4. def LeftToRight(arg):
  5.     if(type(arg) == list and arg.__len__() == 9):
  6.         for i in range(0, 3):
  7.             i1 = 3 * i
  8.             i2 = 3 * i + 1
  9.             i3 = 3 * i + 2
  10.             if not (arg[i1] < arg[i2] and arg[i2] < arg[i3]):
  11.                 return False
  12.         return True
  13.     return False

  14. '''
  15.     list9个元素,上到下验证
  16. '''
  17. def UpToDown(arg):
  18.     if(type(arg) == list and arg.__len__() == 9):
  19.         for i in range(0, 3):
  20.             i1 = i
  21.             i2 = 3 * 1 + i
  22.             i3 = 3 * 2 + i
  23.             if not (arg[i1] < arg[i2] and arg[i2] < arg[i3]):
  24.                 return False
  25.         return True
  26.     return False

  27. '''
  28.     list9个元素,左上到右下验证
  29. '''
  30. def LeftUptoRightDown(arg):
  31.     if(type(arg) == list and arg.__len__() == 9):
  32.         '''# 判断第0,1,3格'''
  33.         for i in range(0, 4):
  34.             if 2 == i:
  35.                 continue
  36.             elif 0 == i:
  37.                 i1 = i
  38.                 i2 = 4 * 1 + i
  39.                 i3 = 4 * 2 + i
  40.                 if not (arg[i1] < arg[i2] and arg[i2] < arg[i3]):
  41.                     return False
  42.             else :
  43.                 i1 = i
  44.                 i2 = 4 * 1 + i
  45.                 if not arg[i1] < arg[i2]:
  46.                     return False
  47.         return True
  48.     return False

  49. '''
  50.     list9个元素,右上到左下验证
  51. '''
  52. def RightUptoLeftDown(arg):
  53.     if(type(arg) == list and arg.__len__() == 9):
  54.         '''# 判断第1,2,5格'''
  55.         for i in range(1, 6):
  56.             if 3 == i or 4 == i:
  57.                 continue
  58.             elif 2 == i:
  59.                 i1 = i
  60.                 i2 = i + 2 * 1
  61.                 i3 = i + 2 * 2
  62.                 if not(arg[i1] < arg[i2] and arg[i2] < arg[i3]):
  63.                     return False
  64.             else :
  65.                 i1 = i
  66.                 i2 = i + 2 * 1
  67.                 if not arg[i1] < arg[i2]:
  68.                     return False
  69.         return True
  70.     return False

  71. '''
  72.     list 放入ix判断:
  73.     ①存在ix元素,不操作
  74.    
  75.     ②list达到9个元素(认为0-8都放入list了)时,
  76.       判断是否以上符合4个函数返回为Ture条件
  77. '''
  78. def ListAppend(arg, ix):
  79.     status = False
  80.     if(type(arg) == list and type(ix) == int and arg.__len__() < 9):
  81.         if 0 == alist.count(ix):
  82.             alist.append(ix)
  83.             status = True

  84.     if(type(arg) == list and arg.__len__() == 9):
  85.         if(LeftToRight(alist) and UpToDown(alist) and LeftUptoRightDown(alist) and RightUptoLeftDown(alist)):
  86.             print('=============================')
  87.             count = 0
  88.             for i in alist:
  89.                 print(i, end = '')
  90.                 count += 1
  91.                 if(count % 3 == 0):
  92.                     print('')
  93.     return status

  94. '''
  95.     递归插入数据,
  96.     arg为list
  97.     ix表示要插入的元素个数
  98.     插入元素为0-8之间的数,数字不会重复插入
  99. '''
  100. def LoopListAppend(arg, ix):
  101.     if(type(arg) == list and type(ix) == int):
  102.         if(ix <= 0):
  103.             return None
  104.         else:
  105.             for i in range(0,9):
  106.                 if ListAppend(arg, i):
  107.                     LoopListAppend(arg, ix -1)
  108.                     arg.remove(i)
  109.    

  110. alist= list()
  111. LoopListAppend(alist, 9)
复制代码

使用的方法为枚举所有组合,然后一个个组合判断是否符合条件。(方法比较笨拙,看看其他鱼友有没有好的想法学习学习)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
677 
累计签到:245 天
连续签到:94 天
BngThea 发表于 2018-2-9 16:36:09 | 显示全部楼层
  1. def show(t):
  2.     length = len(t)
  3.     for i in range(length):
  4.         print(t[i],end=' ')
  5.         if i % 3 == 2:
  6.             print()
  7.     print()

  8. t = [x for x in range(9)]
  9. show(t)
  10. t[5],t[6]=t[6],t[5]
  11. show(t)
  12. t[2],t[3]=t[3],t[2]
  13. show(t)
  14. t[5],t[6]=t[6],t[5]
  15. show(t)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
70 
累计签到:22 天
连续签到:22 天
塔利班 发表于 2018-2-9 17:12:31 | 显示全部楼层
本帖最后由 塔利班 于 2018-2-9 17:14 编辑

首先说下我的代码好蠢,是无脑流,前半部分是生成所有可能的列表组合,我应该是把内存搞出存贮边界了,因为这样会有9!=362880个。。但是如果分析逻辑来说a<b<(c,d可换)<e<(f,g可换)<i,这样结果应该就是4种情况了即0,1,4,7,8不变,2,3可互换,5,6可互换,但是我是按纯懒人思维写的。。也许会让电脑整好一会儿

  1. A=range(9)
  2. L=[]
  3. for a in A:
  4.     for b in A:
  5.         for c in A:
  6.             for d in A:
  7.                 for e in A:
  8.                     for f in A:
  9.                         for g in A:
  10.                             for h in A:
  11.                                 for i in A:
  12.                                     l=[a,b,c,d,e,f,g,h,i]
  13.                                     if len(l)==9:
  14.                                         L.append([[a,b,c],[d,e,f],[g,h,i]])
  15. for each in L:
  16.     [[a,b,c],[d,e,f],[g,h,i]]=each
  17.     if a<b<c and d<e<f and g<h<i and a<d<g and b<e<h and c<f<i and a<e<i and b<f and d<h and b<d and c<e<g and f<h :
  18.         for eachline in each:
  19.             print(eachline)
  20.         print('--------')
复制代码
最佳答案
0 
累计签到:4 天
连续签到:1 天
东小刀 发表于 2018-2-9 17:20:17 | 显示全部楼层
希望有朝一日我也能加入这个帖子
最佳答案
1 
累计签到:281 天
连续签到:3 天
ColbySuns 发表于 2018-2-9 19:56:16 | 显示全部楼层

  1. #自己推断的,可以把答案告诉我吗。。用Python不会写
  2. def main():
  3.     print("NO.1",end = '->')
  4.     print('''
  5.     0 1 2
  6.     3 4 6
  7.     5 7 8''')
  8.     print("--------------------")
  9.     print('NO.2',end = '->')
  10.     print('''
  11.     0 1 3
  12.     2 4 6
  13.     5 7 8''')
  14.     print('---------------------')
  15.     print('NO.3',end = '->')
  16.     print('''
  17.     0 1 2
  18.     3 4 5
  19.     6 7 8''')
  20.     print('---------------------')
  21.     print('NO.4',end = '->')
  22.     print('''
  23.     0 1 3
  24.     2 4 5
  25.     6 7 8''')
  26. main()



复制代码
最佳答案
132 
累计签到:89 天
连续签到:59 天
°蓝鲤歌蓝 发表于 2018-2-9 23:04:20 | 显示全部楼层
  1. L1 = [0,1,0]
  2. L2 = [0,4,0]
  3. L3 = [0,7,8]
  4. for i in range(2,4):
  5.     L1[2] = i
  6.     if L1[2] == 2:
  7.         L2[0] = 3
  8.     elif L1[2] == 3:
  9.         L2[0] = 2
  10.     for j in range(5,7):
  11.         L3[0] = j
  12.         if L3[0] == 5:
  13.             L2[2] = 6
  14.         elif L3[0] == 6:
  15.             L2[2] = 5

  16.         print(L1[0],L1[1],L1[2])

  17.         print(L2[0],L2[1],L2[2])

  18.         print(L3[0],L3[1],L3[2])
  19.         print()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
3 
累计签到:365 天
连续签到:90 天
solomonxian 发表于 2018-2-10 08:46:21 | 显示全部楼层
很直观的想法,排列全试一遍,
规律就不找了,直接按题目定规则

字符串是根据Unicode码比大小的
  1. from itertools import permutations

  2. rule1 = lambda lst: all(lst[0+i] < lst[1+i] < lst[2+i] for i in range(0,7,3))
  3. rule2 = lambda lst: all(lst[i] < lst[i+3] <lst[i+6] for i in range(3))
  4. rule3 = lambda lst: all(lst[i] < lst[i+4] for i in (0,1,3,4))
  5. rule4 = lambda lst: all(lst[i] < lst[i+2] for i in (1,2,4,5))

  6. for i in permutations('123456780'):
  7.     if rule1(i) and rule2(i) and rule3(i) and rule4(i):
  8.         for j in range(3):
  9.             print(*i[3*j: 3*j+3])
  10.         print()

  11. ##0 1 2
  12. ##3 4 5
  13. ##6 7 8
  14. ##
  15. ##0 1 2
  16. ##3 4 6
  17. ##5 7 8
  18. ##
  19. ##0 1 3
  20. ##2 4 5
  21. ##6 7 8
  22. ##
  23. ##0 1 3
  24. ##2 4 6
  25. ##5 7 8
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:15 天
连续签到:3 天
3140056787 发表于 2018-2-10 09:06:04 | 显示全部楼层
print(1, 2, 3)
print(4, 5, 6)
print(7, 8, 9)
最佳答案
0 

尚未签到

lihw 发表于 2018-2-10 16:23:44 | 显示全部楼层
  1. import numpy as np
  2. import itertools
  3. i=0
  4. j=0
  5. count=0
  6. list2=[]
  7. for list1 in itertools.permutations([0,1,2,3,4,5,6,7,8],9):
  8.     x=np.asarray(list1).reshape(3,3)
  9.    
  10.     if x[0][0]<x[0][1]<x[0][2] and x[0][0]<x[1][0]<x[2][0] and x[0][0]<x[1][1]<x[2][2] and x[0][1]<x[1][2] and x[1][0]<x[2][1] and x[0][2]<x[1][1]<x[2][0] and x[0][1]<x[1][0]and x[1][2]<x[2][1] :
  11.          if x[1][0]<x[1][1]<x[1][2] and x[0][1]<x[1][1]<x[2][1] :
  12.              if x[2][0]<x[2][1]<x[2][2] and x[0][2]<x[1][2]<x[2][2] :
  13.                  for i in x:
  14.                      print(i)
  15.                      count+=1
  16.                      if count==3:
  17.                          print("                       ")
  18.                          count=0
  19.                      
  20.             
  21.                     
  22.                
  23.                
  24.             
  25.   
  26.    
  27.          

复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:15 天
连续签到:3 天
3140056787 发表于 2018-2-10 17:44:56 | 显示全部楼层
list1 = []
for a in range(1, 4):
    list1.append(a)
list2 = []
for b in range(4, 7):
    list2.append(b)
list3 = []
for c in range(7, 10):
    list3.append(c)
l3 = str(list3).strip('[]')
l2 = str(list2).strip('[]')
l1 = str(list1).strip('[]')

item = (l1, l2, l3)
for i in item:
    print(i)
最佳答案
0 
累计签到:7 天
连续签到:1 天
graceasyi 发表于 2018-2-10 18:02:36 | 显示全部楼层
好难啊,虽然自己分析一下结果就出来了,可是不知道怎么编程实现,好不容易实现了,但用得方法实在太复杂,只能处理2*2,3*3的,再大就处理不了了。
等高手的答案。智商还是不够用……

  1. def is_ordering(list1):
  2.     for sub in list1:
  3.         for i in range(len(sub)-1):
  4.             if sub[i+1] <= sub[i]:
  5.                 return False
  6.     else:
  7.         return True


  8. def col_trans(list1):
  9.     l = len(list1)
  10.     w = len(list1[0])
  11.     tmp = [[0 for i in range(l)] for i in range(w)]         
  12.     for i in range(l):
  13.         for j in range(w):
  14.             tmp[j][i] = list1[i][j]
  15.     return tmp


  16. # list1是一个行列相等的二维列表, direction是列表旋转方向,True为逆时针旋转90度,False为顺时针旋转90度,为了题目从后往前取
  17. def rotate(list1, direction):
  18.     l = len(list1)
  19.     n = 2*l-1
  20.     tmp = []
  21.     if direction:
  22.         for i in range(l):
  23.             tmp.append([list1[j][l - 1 - (i - j)] for j in range(i + 1)])
  24.         for i in range(n-l):
  25.             tmp.append([list1[j + i + 1][j] for j in range(n - l - i)])
  26.         return tmp
  27.     else:
  28.         for i in range(l):
  29.             tmp.append([list1[j][i - j] for j in range(i + 1)])
  30.         for i in range(n-l):
  31.             tmp.append([list1[j + i + 1][l - 1 - j] for j in range(n - l - i)])
  32.         return tmp


  33. from itertools import permutations

  34. perms = list(permutations(range(9), 9))
  35. for per in perms:
  36.     n = round(len(perms[0]) ** 0.5)
  37.     tmp = [per[j * n:j * n + n] for j in range(len(per) // n)]
  38.     if is_ordering(tmp) and is_ordering(col_trans(tmp)) and \
  39.             is_ordering(rotate(tmp, True)) and is_ordering(rotate(tmp, False)):
  40.         print(tmp)
复制代码


结果:
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
[(0, 1, 2), (3, 4, 6), (5, 7, 8)]
[(0, 1, 3), (2, 4, 5), (6, 7, 8)]
[(0, 1, 3), (2, 4, 6), (5, 7, 8)]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:17 天
连续签到:1 天
787330410 发表于 2018-2-10 20:00:30 From FishC Mobile | 显示全部楼层
#刚学python不久,在手机上写,代码有点乱
#a b c
#d e f
#g h i

for a in range(9):
    for b in range(9):
        if b!=a:
            for c in range(9):
                if c!=b and c!=a:
                    for d in range(9):
                        if d!=c and d!=b and d!=a:
                            for e in range(9):
                                if e!=d and e!=c and e!=b and e!=a:
                                    for f in range(9):
                                        if f!=e and f!=d and f!=c and f!=b and f!=a:
                                            for g in range(9):
                                                if g!=f and g!=e and g!=d and g!=c and g!=b and g!=a:
                                                    for h in range(9):
                                                        if h!=g and h!=f and h!=e and h!=d and h!=c and h!=b and h!=a:
                                                            for i in range(9):
                                                                if i!=h and i!=g and i!=f and i!=e and i!=d and i!=c and i!=b and i!=a:
                                                                    if c-a==2*(b-a)==2*(c-b)==f-d==2*(e-d)==2*(f-e)==i-g==2*(h-g)==2*(i-h):
                                                                        if g-a==2*(d-a)==2*(g-d)==h-b==2*(e-b)==2*(h-e)==i-c==2*(f-c)==2*(i-f):
                                                                            if i-a==2*(e-a)==2*(i-e)==2*(f-b)==2*(h-d):
                                                                                if g-c==2*(e-c)==2*(g-e)==2*(d-b)==2*(h-f):
                                                                                    print('%d %d %d\n%d %d %d\n%d %d %d\n'%(a,b,c,d,e,f,g,h,i))
最佳答案
3 
累计签到:20 天
连续签到:20 天
int_lyc 发表于 2018-2-10 23:24:49 | 显示全部楼层
可以暴力破解吗,我只会暴力破解
  1. a = [0,0,0,0,0,0,0,0,0]

  2. for i in range(9):
  3.         a[0]=i
  4.         for i in range(9):
  5.                 a[1]=i
  6.                 for i in range(9):
  7.                         a[2]=i
  8.                         for i in range(9):
  9.                                 a[3]=i
  10.                                 for i in range(9):
  11.                                         a[4]=i
  12.                                         for i in range(9):
  13.                                                 a[5]=i
  14.                                                 for i in range(9):
  15.                                                         a[6]=i
  16.                                                         for i in range(9):
  17.                                                                 a[7]=i
  18.                                                                 for i in range(9):
  19.                                                                         a[8]=i
  20.                                                                         if len(a)==len(set(a)):
  21.                                                                                         if a[0]<a[1]<a[2] and a[3]<a[4]<a[5] and a[6]<a[7]<a[8]:
  22.                                                                                                 if a[0]<a[3]<a[6] and a[1]<a[4]<a[7] and a[2]<a[5]<a[8]:
  23.                                                                                                         if a[0]<a[4]<a[8] and a[1]<a[5] and a[3]<a[7]:
  24.                                                                                                                 if a[2]<a[4]<a[6] and a[1]<a[3] and a[5]<a[7]:
  25.                                                                                                                         print(a[0],a[1],a[2])
  26.                                                                                                                         print(a[3],a[4],a[5])
  27.                                                                                                                         print(a[6],a[7],a[8],"\n")
复制代码

草图.png

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:7 天
连续签到:3 天
天圆突破 发表于 2018-2-11 00:10:27 | 显示全部楼层
本帖最后由 天圆突破 于 2018-2-11 08:57 编辑
  1. '''
  2. 使用列表来存储信息
  3. lst[0]  lst[1]  lst[2]
  4. lst[3]  lst[4]  lst[5]
  5. lst[6]  lst[7]  lst[8]

  6. 规则写成条件:
  7. lst[0] < lst[1] < lst[2] and lst[3] < lst[4] < lst[5] and lst[6] < lst[7] < lst[8] and lst[0] < lst[3] < lst[6] and lst[1] < lst[4] < lst[7] and lst[2] < lst[5] < lst[8] and lst[0] < lst[4] < lst[8] and lst[3] < lst[7] and lst[1] < lst[5] and lst[2] < lst[4] < lst[6] and lst[1] < lst[3] and lst[5] < lst[7]

  8. 算法分析:
  9. 0一定要在lst[0],因为没有比0更小的数字
  10. 8一定要在lst[8],以为没有比8更大的数字
  11. 1一定要在lst[1],因为这个位置必须是第二小的位置(其他位置都要有一个除了0以外比它小的数字)
  12. 7一定要在lst[7],因为这个位置必须是第二大的位置(其他位置都要有一个除了8以外比它大的数字)
  13. 以上四个位置在任何时候必须固定

  14. 数字2有两种情况,lst[2]和lst[3],在其他任何位置都会违反规则(易证,略)
  15. 数字6有两种情况,lst[5]和lst[6],在其他任何位置都会违反规则(易证,略)

  16. 以上固定了:lst = [0, 1, x, x, x, ,x ,x ,7 ,8]
  17. 因为数字2有2种情况,数字6有两种情况,合计4个分支
  18. 再需要判断3、4、5即可,一共只有2*2*6=24情况,交给程序验证
  19. 剩下的就是打字的体力活了
  20. 算法分析结束
  21. '''
  22. def middle(lst_temp):
  23.     temp = [3, 4, 5]
  24.     temp1 = [(i, j, k) for i in temp for j in temp for k in temp if i != j and j != k and i != k]
  25.     flag =  [x for x in range(8) if lst_temp[x] == None]
  26.     for each in temp1:
  27.         lst = lst_temp.copy()
  28.         lst[flag[0]], lst[flag[1]], lst[flag[2]] = each
  29.         if lst[0] < lst[1] < lst[2] and lst[3] < lst[4] < lst[5] and lst[6] < lst[7] < lst[8] and lst[0] < lst[3] < lst[6] and lst[1] < lst[4] < lst[7] and lst[2] < lst[5] < lst[8] and lst[0] < lst[4] < lst[8] and lst[3] < lst[7] and lst[1] < lst[5] and lst[2] < lst[4] < lst[6] and lst[1] < lst[3] and lst[6] < lst[7]:
  30.             print('%d %d %d\n%d %d %d\n%d %d %d'%tuple(lst))
  31.             print('*'*5)

  32. def case6(lst):
  33.     for i in range(2):
  34.         if i == 0:
  35.             lst_temp = lst.copy()
  36.             lst_temp[6] = 6
  37.             middle(lst_temp)
  38.         elif i == 1:
  39.             lst_temp = lst.copy()
  40.             lst_temp[5] = 6
  41.             middle(lst_temp)

  42. def nine():
  43.     lst = [None for i in range(9)]
  44.     lst[0] = 0; lst[1] = 1; lst[7] = 7; lst[8] = 8
  45.     for i in range(2):
  46.         if i == 0:
  47.             lst_temp = lst.copy()
  48.             lst_temp[2] = 2
  49.             case6(lst_temp)
  50.         if i == 1:
  51.             lst_temp = lst.copy()
  52.             lst_temp[3] = 2
  53.             case6(lst_temp)

  54. if __name__ == '__main__':
  55.     nine()
复制代码

jiugongge.jpg

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
累计签到:7 天
连续签到:2 天
啊农索 发表于 2018-2-11 19:55:29 | 显示全部楼层
for a1 in range(9):
     for a2 in range(9):
         for a3 in range(9):
             for a4 in range(9):
                 for a5 in range(9):
                     for a6 in range(9):
                         for a7 in range(9):
                             for a8 in range(9):
                                 for a9 in range(9):
                                    if (a1<a2)and(a2<a3)and(a4<a5)and(a5<a6)\
and(a7<a8)and(a8<a9)and(a1<a4)and(a4<a7)and(a2<a5)and(a5<a8)and(a3<a6)and(a6<a9)\
and(a1<a5)and(a5<a9)and(a2<a6)and(a4<a8)and(a2<a4)and(a3<a5)and(a5<a7)and(a6<a8)\
and(a3!=a4)and(a6!=a7):
                                        print(a1,a2,a3)
                                        print(a4,a5,a6)
                                        print(a7,a8,a9)
                                        print('=============')
                                    
                                    
      

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /2 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2018-2-19 07:53

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