-5

整数の N*N リストが魔方陣を形成するかどうかを判断するコードがあります。

import itertools

#Function square magic
def magic_square(matrix):
    dimension = len(matrix[0])
    sum_list = []

    #Horizontal code:
    sum_list.extend([sum (lines) for lines in matrix])   

    #Vertical code:
    for col in range(dimension):
        sum_list.append(sum(row[col] for row in matrix))

    #Diagonals code
    diagonal1 = 0
    for i in range(0,dimension):
        diagonal1 +=matrix[i][i]
    sum_list.append(diagonal1)  

    diagonal2 = 0
    for i in range(dimension-1,-1,-1):
        diagonal2 +=matrix[i][i]
    sum_list.append(diagonal2)

    if len(set(sum_list))>1:
        return False
    return True

m=[[7, 12, 1, 14], [2, 13, 8, 11], [16, 3, 10, 5], [9, 6, 15, 4]] 
print(magic_square(m))

m=[[2, 7, 6], [9, 5, 1], [4, 3, 8]]
print(magic_square(m))

m=[[2, 7, 6], [9, 5, 1], [4, 3, 7]]
print(magic_square(m))

print("**************************")

#Now, i use itertools like this:
for i in itertools.combinations(range(1,10), 3):
    if sum(i) == 15:
        print (i)
# I get the combinations each of three numbers with sum 15

私の問題は最後の部分です: 1 から N^2 までの整数のすべての順列を生成し、それぞれを正方形 (N 行と N 列の 2-D リスト) に分割し、関数を使用してすべての魔法を見つけたいと考えています。正方形。私が書いたitertoolsコードは、仕事をする 3 つの数字の組み合わせを見つけますが、正方形を形成するための組み合わせを理解できません。

助けてくれてありがとう@プルーン。

[
1 5 9]
[1 6 8]
[2 4 9]
[2 5 8]
[2 6 7]
[3 4 8]
[3 5 7]
[4 5 6]
正方形を生成する方法一度に 3 つの行列の要素を使用して、True または False であるかどうかを魔法で知ることができますか?
例:
[[1 5 9],[1 6 8], [2 4 9]]
または
[[1 5 9],[1 6 8], [2 5 8]]
または
[[1 5 9],[ 1 6 8]、[2 6 9]]など。

4

3 に答える 3

0

なるほど -- 魔方陣のすべての順列を生成したいのですね。1 からN ^2までの範囲のすべての順列をカバーする必要があり、それぞれN要素のNリストとして返されます。

import itertools

N = 3
for seq in itertools.permutations(range(1, N*N+1)):
    # Split the sequence into a candidate magic square,
    #   N rows of N elements each.
    cand = [seq[i:i+N] for i in range(0, N*N, N)]

これにより、一連の候補正方形が生成されます。それぞれをチェックルーチンに順番にフィードし、 Trueになったものを出力します。その部分を処理できることを期待しています。

以下は、世代の初期段階からのいくつかのサンプル候補です。

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

方法の変更

これはオリジナルのアルゴリズムではないことに注意してください。これは、3 の行だけではなく、正方形全体を生成します。独立した生成には、9 つ​​の数字すべてを含まない魔方陣を生成し、他のものを複製するという点で、論理的な欠陥があります。例えば:

7 2 6
4 5 6
4 8 3
于 2016-12-29T00:32:38.037 に答える