• + 0 comments

    I took a similar approach. Here is my Python 2 solution:

    def build_grid(m, n, walls):
        grid = [[0 for j in xrange(n)] for i in xrange(m)]
        for w in xrange(len(walls)):
            wall = walls[w]
            wall_i = 0
            for i in xrange(w, m - w):
                grid[i][w] = wall[wall_i]
                wall_i += 1
            
            for j in xrange(1 + w, n - w):
                grid[-(1 + w)][j] = wall[wall_i]
                wall_i += 1
                
            for i in xrange(-2 - w, -m - 1 + w, -1):
                grid[i][-(1 + w)] = wall[wall_i]
                wall_i += 1
            
            for j in xrange(-2 - w, -n + w, -1):
                grid[w][j] = wall[wall_i]
                wall_i += 1
                
        return '\n'.join(' '.join(map(str, row)) for row in grid)
    
    def get_rotated_grid():
        m, n, r = map(int, raw_input().split())
        grid = [map(int, raw_input().split()) for i in xrange(m)]
        walls = get_walls(m, n, grid)
        rotate_walls(r, walls)        
        return build_grid(m, n, walls)
    
    
    def get_walls(m, n, grid):
        walls = []
        while any(grid):
            wall = []
            wall.extend(grid[i][0] for i in xrange(m))
            wall.extend(grid[-1][j] for j in xrange(1, n))
            wall.extend(grid[i][-1] for i in xrange(-2, -m - 1, -1))
            wall.extend(grid[0][j] for j in xrange(-2, -n, -1))
            walls.append(wall)
            grid = [grid[i][1:-1] for i in xrange(1, len(grid) - 1)]
            m -= 2
            n -= 2
        
        return walls
    
    def rotate_walls(r, walls):
        for i in xrange(len(walls)):
            wall = walls[i]
            wall_length = len(wall)
            rotations = r % wall_length
            walls[i] = wall[-rotations:] + wall[:-rotations]
    

    The entrypoint is get_rotated_grid()