【问题标题】:Clockwise Shifting a Matrix顺时针移动矩阵
【发布时间】:2015-06-05 09:07:31
【问题描述】:

输入是一个 N x N 矩阵,必须循环(顺时针或逆时针)移位一个元素。

示例输入(大小 3):

1 2 3
4 5 6
7 8 9

输出:

2 3 6
1 5 9
4 7 8

示例输入(4 号):

10 20 5  5
22 33 4  10
2  6  8  9
55 11 66 7

输出:

22 10 20 5 
2  6  33 5 
55 8  4  10
11 66 7  9

我需要知道如何解决这个问题。

【问题讨论】:

  • 给我一分钟,我会带着算法、实现和热咖啡回来
  • @user3476387,我认为您没有掌握您所要求的内容的重要性,这不是“哦,好吧,应用这个三行函数,你会得到它”的问题。
  • 很抱歉询问实现。这是我的一个错误。
  • 我想我会采取的方法是: - 一个从原始输入估计层数的函数 - 一个将一层提取到线性数组中的函数,顺时针移动一个方向,逆时针并将其放回原始矩阵中。然后我会遍历这些层。
  • @Jblasco 实际上逻辑几乎是两条线:for i, j in product(range(n), range(m)): B[i][j] = A[(i+dx)%n][(j+dy)%m]

标签: python algorithm matrix


【解决方案1】:

对于旋转,按顺序读取元素:
i -> 0 到 n-1 和 j = 0
j -> 0 到 n-1 和 i = n-1
i -> n-1 到 0 和 j = n-1
j -> n-1 到 0 并且 i = 0

import collections
def shiftMatrix(matrix, layers, num,rotate_direction):
    for count in range(layers):
        temp1 = []
        i = count
        for j in range(count, num - count):
            temp1.append(matrix[i][j])
        j = num - 1 - count
        for i in range(1 + count, num - count -1):
            temp1.append(matrix[i][j])
        i = num - 1 - count
        for j in range(num - 1 - count, -1 + count, -1):
            temp1.append(matrix[i][j])
        j = count
        for i in range(num - 1 - count - 1, 0 + count, -1):
            temp1.append(matrix[i][j])
        temp = collections.deque(temp1)
        temp.rotate(rotate_direction)
        temp1 = list(temp)
        counter = 0
        i = count
        for j in range(count, num - count):
            matrix[i][j] = temp1[counter]
            counter += 1
        j = num - 1 - count
        for i in range(1 + count, num - count -1):
            matrix[i][j] = temp1[counter]
            counter += 1
        i = num - 1 - count
        for j in range(num - 1 - count, -1 + count, -1):
            matrix[i][j] = temp1[counter]
            counter += 1
        j = count
        for i in range(num - 1 - count - 1, 0 + count, -1):
            matrix[i][j] = temp1[counter]
            counter += 1
        return matrix


if __name__ == '__main__':
    num = int(raw_input())
    op_type = raw_input()
    matrix = []
    for i in range(num):
        temp = []
        input_string = raw_input().split()
        for element in input_string:
            temp.append(int(element))
        matrix.append(temp)
    if(num >= 3):
        layers = num - 3 + 1
    else:
        layers = 1
    if(op_type == "CW"):
        matrix_result = shiftMatrix(matrix,layers,num,1);
    else:
        matrix_result = shiftMatrix(matrix,layers,num,-1);
    print(" ".join((" ".join(map(str,element))) for element in matrix_result))

说明: 大小为 N 的矩阵的层数为 N-3。对于每一层,元素都以顺时针方式收集,然后转换为顺时针或逆时针旋转的队列。

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多