• + 0 comments

    I first precomputed all magic squares. There's only one: 4 rotations and 4 mirrors, hence 8 representations of the same magic square. I then printed them and hard coded them.

    public static int formingMagicSquare(List<List<Integer>> s) {
    // Write your code here
    // precomputed all magic squares.
        int[][] allmagic = new int[][] {
        {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}
        };
        int[] sint = new int[9];
        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                sint[x + y * 3] = s.get(y).get(x);
            }
        }
        int count = 9 * 9;
        for (int i = 0; i < allmagic.length;i++) {
            int mycount = 0;
            for (int j = 0; j < 9; j++) {
                mycount += Math.abs(allmagic[i][j] - sint[j]);
            }
            if (mycount < count) {
                count = mycount;
            }
        }
        return count;
    }