Python 3.5.0:魔方阵

0 投票
3 回答
1346 浏览
提问于 2025-05-10 20:19

我正在尝试制作一个魔方阵:

魔方阵是一个被分成行和列的方阵,每个位置上都有一个数字,并且每一行、每一列和对角线的数字之和都是相同的。

例如(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

相关问题:

  • 暂无相关问题
暂无标签

3 个回答

-1

试试我的代码..

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)
0

在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。比如,有人可能会在使用某个特定的功能时,发现它并没有按照预期工作。这种情况可能会让人感到困惑,因为我们可能不知道哪里出了问题。

通常,解决这类问题的第一步是仔细检查代码,看看有没有拼写错误或者逻辑上的问题。很多时候,问题可能只是因为一个小小的错误,比如少了一个符号或者写错了一个变量名。

另外,查看相关的文档也是很重要的。文档通常会提供使用某个功能的详细说明和示例,这样可以帮助我们更好地理解如何正确地使用它。

如果自己解决不了问题,可以考虑向社区求助,比如在论坛上提问。记得描述清楚你的问题,并附上相关的代码,这样别人才能更好地帮助你。

总之,遇到问题时不要着急,慢慢分析,查阅资料,必要时寻求帮助,通常都能找到解决办法。

    def forEvenNumber(n):
    arr = [[(n * y) + x + 1 for x in range(n)] for y in range(n)]
    for i in range(0, n // 4):
        for j in range(0, n // 4):
            arr[i][j] = (n * n + 1) - arr[i][j];
    for i in range(0, n // 4):
        for j in range(3 * (n // 4), n):
            arr[i][j] = (n * n + 1) - arr[i][j];
    for i in range(3 * (n // 4), n):
        for j in range(0, n // 4):
            arr[i][j] = (n * n + 1) - arr[i][j];
    for i in range(3 * (n // 4), n):
        for j in range(3 * (n // 4), n):
            arr[i][j] = (n * n + 1) - arr[i][j];
    for i in range(n // 4, 3 * (n // 4)):
        for j in range(n // 4, 3 * (n // 4)):
            arr[i][j] = (n * n + 1) - arr[i][j];
    print("\nSum of all row, column and diagonals = ",
          n * (n * n + 1) // 2, "\n")
    for i in range(n):
        for j in range(n):
            print('%2d ' % (arr[i][j]), end=" ")
        print()
def forOddNumber(n):
    mgsqr = [[0 for x in range(n)]
             for y in range(n)]
    r = n // 2
    c = n - 1
    num = 1
    while num <= (n * n):
        if r == -1 and c == n:
            c = n - 2
            r = 0
        else:
            if c == n:
                c = 0
            if r < 0:
                r = n - 1
        if mgsqr[int(r)][int(c)]:
            c = c - 2
            r = r + 1
            continue
        else:
            mgsqr[int(r)][int(c)] = num
            num = num + 1
        c = c + 1
        r = r - 1
    print("\nSum of all row, column and diagonals = ",
          n * (n * n + 1) // 2, "\n")
    for i in range(0, n):
        for j in range(0, n):
            print('%2d ' % (mgsqr[i][j]), end='')
        print()
print("\nWELCOME:)\n")
n = int(input("Please Enter Number of Rows and Column (n*n): "))
if n%2==0:
    forEvenNumber(n)
else:
    forOddNumber(n)
print("\nThank You :)")
3

你的随机代码有问题。

>>> 
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

第二种方法是在magicsquarereturn条件:

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)

撰写回答