【问题标题】:python 3.5.0 :::: MAGIC SQUAREpython 3.5.0 :::: 魔法广场
【发布时间】:2015-11-22 13:07:14
【问题描述】:

我正在尝试构建一个幻方:

幻方是一个分为行和列,每个位置都有一个数字,并且行、列和对角线之和相同的幻方。 示例(3x3 - 从 1 到 9 的数字):

8 3 4

1 5 9

6 7 2

我尝试使用 3x3 矩阵和具有 9 个索引的向量。

import random
                #j(column)
matriz = [[1, 2, 3],#i(row)
          [4, 5, 6],
          [7, 8, 9]]
res = False
#DEFINE A FUNCTION TO CALCULATE ALL SUMS OF ALL SIDES
def magicsquare():
    if matriz[0][0] + matriz[1][0] + matriz[2][0] == matriz[0][1] + matriz[1][1] + matriz[2][1] == matriz[0][2] + matriz[1][2] + matriz[2][2] == matriz[0][0] + matriz[0][1] + matriz[0][2] == matriz[1][0] + matriz[1][1] + matriz[1][2] == matriz[2][0] + matriz[2][1] + matriz[2][2] == matriz[0][0] + matriz[1][1] + matriz[2][2] == matriz[0][2] + matriz[1][1] + matriz[2][0]:
        return res = True
    else:
        return res = False

#DEFINE A LOOP TO GENERATE RANDOM NUMBER UNTIL FIND THE ONES THAT
#SATISFY THE CONDITIONS OF A MAGIC SQUARE
seq = [1, 2, 3, 4, 5, 6, 7, 8, 9]
while res == False:
    for i in range(2):
        for j in range(2):
            z = random.choice(seq)
            matriz[i][j] = z
            x = seq.index(z)
            seq[x] = []
    magicsquare()
print (matriz)
#---------------------------------------------------------------------------------------------------------------------------------------------------------------
res = False
def magicsquare():
    if vetor[0] + vetor[1] + vetor[2] == vetor[3] + vetor[4] + vetor[5] == vetor[6] + vetor[7] + vetor[8] == vetor[0] + vetor[3] + vetor[6] == vetor[1] + vetor[4] + vetor[7] == vetor[2] + vetor[5] + vetor[8] == vetor[0] + vetor[4] + vetor[8] == vetor[2] + vetor[4] + vetor[6]:
        return res == True
    else:
        return res == False
#        0  1  2  3  4  5  6  7  8
vetor = [1, 2, 3, 4, 5, 6, 7, 8, 9]
seq =   [1, 2, 3, 4, 5, 6, 7, 8, 9]
if res == False:
    for i in range(8):
        w = random.choice(seq)
        #Replace the value w in index i
        vetor.insert(i, w)
        #Eliminate the valyes already used
        x = seq.index(w)
        seq[x] =[]
    magicsquare()
print (vetor)

结果总是: [1, 2, 3, 4, 5, 6, 7, 8, 9]

谁能帮我建立一个幻方并告诉我的代码有什么问题?

使用 Python 3.5.0

【问题讨论】:

标签: python python-3.x matrix random vector


【解决方案1】:

你的随机代码是错误的。

>>> 
Traceback (most recent call last):
  File "C:/Users/xiao/Desktop/ms.py", line 20, in <module>
    magicsquare()
  File "C:/Users/xiao/Desktop/ms.py", line 5, in magicsquare
    if vetor[0] + vetor[1] + vetor[2] == vetor[3] + vetor[4] + vetor[5] == vetor[6] + vetor[7] + vetor[8] == vetor[0] + vetor[3] + vetor[6] == vetor[1] + vetor[4] + vetor[7] == vetor[2] + vetor[5] + vetor[8] == vetor[0] + vetor[4] + vetor[8] == vetor[2] + vetor[4] + vetor[6]:
TypeError: unsupported operand type(s) for +: 'int' and 'list'
>>> vetor
[9, 4, 8, 2, 3, [], [], [], 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 

random 模块有一个名为shuffle 的方法用于打乱列表。如果您不知道自己的代码,请使用random.shuffle

另外,有两种方法可以停止while 循环。第一种方法是在函数magicsquare中更改全局变量res

def magicsquare():
    global res
    if ...:
        res = True
    else:
        res = False

另一种方法是returnmagicsquare中的条件:

import random

vetor = [1, 2, 3, 4, 5, 6, 7, 8, 9]

def magicsquare():
    return vetor[0]+vetor[1]+vetor[2]==\
           vetor[3]+vetor[4]+vetor[5]==\
           vetor[6]+vetor[7]+vetor[8]==\
           vetor[0]+vetor[3]+vetor[6]==\
           vetor[1]+vetor[4]+vetor[7]==\
           vetor[2]+vetor[5]+vetor[8]==\
           vetor[0]+vetor[4]+vetor[8]==\
           vetor[2]+vetor[4]+vetor[6]

while not magicsquare():
    random.shuffle(vetor)

print (vetor)

【讨论】:

    【解决方案2】:

    试试我的代码..

    box = []
    
    num = [1, 2, 3,
           4, 5, 6,
           7, 8, 9]
    
    val = []
    
    for i in num:
        for j in num:
            for k in num:
                if ((i+j+k) == 15) and i != j and j != k and k != i:
                    val.append((i, j, k))
    
    
    def check_sum(lst: list):
        rtn = []
        res = 0
        lst = lst[0]
        for c in range(3):
            for r in range(3):
                res += lst[r][c]
            if res == 15:
                rtn.append(True)
    
            else:
                rtn.append(False)
    
            res = 0
    
        res = 0
    
        for x in range(3):
            for y in range(3):
                if x == y:
                    res += lst[x][y]
    
        if res == 15:
            rtn.append(True)
    
        else:
            rtn.append(False)
    
        res = 0
    
        for x in range(3):
            for y in range(3):
                if x+y == 2:
                    res += lst[x][y]
    
        if res == 15:
            rtn.append(True)
    
        else:
            rtn.append(False)
    
        return all(rtn)
    
    
    def is_unique(a, b, c):
        st = set()
        for x in a:
            st.add(x)
    
        for x in b:
            st.add(x)
    
        for x in c:
            st.add(x)
    
        if len(st) == 9:
            return True
        else:
            return False
    
    
    def print_box(b):
        for row in b[0]:
            print(row)
        print()
    
    
    for i in val:
        for j in val:
            for k in val:
                if is_unique(i, j, k):
                    box.append([i, j, k])
                    if check_sum(box):
                        print_box(box)
                    if len(box) == 1:
                        box.clear()
    

    输出是:

    (2, 7, 6)
    (9, 5, 1)
    (4, 3, 8)
    
    (2, 9, 4)
    (7, 5, 3)
    (6, 1, 8)
    
    (4, 3, 8)
    (9, 5, 1)
    (2, 7, 6)
    
    (4, 9, 2)
    (3, 5, 7)
    (8, 1, 6)
    
    (6, 1, 8)
    (7, 5, 3)
    (2, 9, 4)
    
    (6, 7, 2)
    (1, 5, 9)
    (8, 3, 4)
    
    (8, 1, 6)
    (3, 5, 7)
    (4, 9, 2)
    
    (8, 3, 4)
    (1, 5, 9)
    (6, 7, 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      相关资源
      最近更新 更多