Переставляя волшебные квадраты - PullRequest
0 голосов
/ 12 декабря 2011

У меня небольшие проблемы с написанием рекурсивной функции перестановки для решения магических квадратов. Для этой функции мне не разрешено использовать двумерные массивы, только списки. Ниже то, что у меня есть на данный момент:

def permute(size):
    magicSquare = []
    for value in permute(size**2):
        for pos in range(size**2 + 1):
            magicSquare.append(value)
    return magicSquare

size определяется пользователем через аргумент командной строки.

Я немного растерялся, если написанная выше функция выполняет задачу перестановки значений.

Ответы [ 2 ]

5 голосов
/ 12 декабря 2011

Это не выглядит и фактически не должно заканчиваться так, как написано в настоящее время.

Простой способ начать думать об этой проблеме состоит в том, что магический квадрат может быть представлен списком размером n**2, поэтому магический квадрат 3х3 может быть представлен списком из 9 длин.Поскольку это магический квадрат, вам нужно переставить значения range(1,n+1), например, для 3x3:

1 2 3
4 5 6
7 8 9

Проверьте, не магический ли это квадрат (это не строки не суммируются с одним и тем же значением ) и, если оно есть, добавьте его в список магических квадратов.В любом случае, попробуйте следующую перестановку:

1 2 3
4 5 6
7 9 8

... до тех пор, пока не закончите перестановки.Это, конечно, неоптимальный маршрут, потому что строка с ошибками (1, 2, 3) по-прежнему не составит 15, поэтому есть место для оптимизации и простого отказа от возможностей, которые не будут работать.

Простой инструмент для проверки вашей работы или выполнения перестановки для вас - itertools.permutations.Который создаст генератор , который будет выдавать каждую дополнительную перестановку до тех пор, пока их больше не будет.

Обратите внимание, что для чего-либо, превышающего тривиальный квадрат, вы превысите максимальный предел рекурсиивы пытаетесь сделать еще один рекурсивный вызов каждый раз, используя этот метод.Вам нужно будет найти способ справиться с этой ситуацией один раз size=3.Есть несколько способов справиться с этим различной степени сложности, в зависимости от того, что именно вы пытаетесь сделать.

0 голосов
/ 13 августа 2014

Вот простой метод проверки магического квадрата или нет.

Примечание: попробуйте использовать сетку 3 * 3.

def magic():
    print "maximam 9 values"
    a=[]
    for i in range(3):
        a.append([])
        for j in range(3):
            a[i].append(input('Enter the values'))
    print a
    l1= a[0][0]+a[1][0]+a[2][0]
    l2=a[0][1]+a[1][1]+a[2][1]
    l3=a[0][2]+a[1][2]+a[2][2]
    r1=sum(a[0])
    r2=sum(a[1])
    r3=sum(a[2])
    if l1 == l2 == l3 == r1 == r2 == r3:
        print a,"Its magic square"
    else:
        print a,"not magic square"
magic()
...