• + 0 comments

    Nice explanation. I used this logic and wrote the python code as under. Instead of constructing all magic squares, I found out cost for all magic squares and took minimum.

    def formingMagicSquare(s):
        cost = abs(s[1][1] - 5)
        costArr = [0, 0, 0, 0, 0, 0, 0, 0]
        pickArr = [0, 2, 6, 8]
        for i in range(4):
            n = pickArr[i]
            m = pickArr[i+1] if i % 2 == 0 else pickArr[i-1]
            p = (n+m) / 2
            q = (8-m+n) / 2
            costArr[i*2] += abs(s[n/3][n%3] - 4)
            costArr[i*2] += abs(s[(8-n)/3][(8-n)%3] - 6)
            costArr[i*2] += abs(s[m/3][m%3] - 2)
            costArr[i*2] += abs(s[(8-m)/3][(8-m)%3] - 8)
            costArr[i*2] += abs(s[p/3][p%3] - 9)
            costArr[i*2] += abs(s[(8-p)/3][(8-p)%3] - 1)
            costArr[i*2] += abs(s[q/3][q%3] - 3)
            costArr[i*2] += abs(s[(8-q)/3][(8-q)%3] - 7)
            costArr[i*2+1] += abs(s[n/3][n%3] - 4)
            costArr[i*2+1] += abs(s[(8-n)/3][(8-n)%3] - 6)
            costArr[i*2+1] += abs(s[m/3][m%3] - 8)
            costArr[i*2+1] += abs(s[(8-m)/3][(8-m)%3] - 2)
            costArr[i*2+1] += abs(s[p/3][p%3] - 3)
            costArr[i*2+1] += abs(s[(8-p)/3][(8-p)%3] - 7)
            costArr[i*2+1] += abs(s[q/3][q%3] - 9)
            costArr[i*2+1] += abs(s[(8-q)/3][(8-q)%3] - 1)
        return min(costArr) + cost