7-1 旋转方阵python 对于一个奇数n阶方阵,请给出经过顺时针方向m次旋转(每次旋转90度)后的结果。 输入格式: 测试数据有多组,处理到文件尾。每组测试的第一行输入2个整数n,m(1<n<20,1≤m≤100),接下来输入n行数据,每行n个整数。 输出格式: 对于每组测试,输出奇数阶方阵经过m次顺时针方向旋转后的结果。每行中各数据之间留一个空格。
时间: 2025-03-13 14:15:16 浏览: 82
<think>嗯,用户想要用Python实现一个奇数阶方阵顺时针旋转m次的功能。首先,我需要理解顺时针旋转90度的基本操作。记得旋转矩阵通常可以通过转置然后翻转每一行来实现,对吧?比如,一个3x3的矩阵,转置后交换行顺序就能得到顺时针旋转90度的结果。
然后,用户提到的是旋转m次,每次都是顺时针90度。所以,如果m是1,就转一次;如果是2,就是转两次,也就是180度。但这里有个问题,m可能很大,比如100次,这时候直接旋转100次效率可能不高。不过因为旋转四次就会回到原样,所以可以对m取模4,这样只需要旋转m%4次,减少计算量。比如,m=5的话,实际只需要转1次。
接下来,我需要考虑如何将转置和翻转行的操作结合起来。对于一次旋转,正确的步骤应该是先转置矩阵,然后翻转每一行。比如,原矩阵转置后,每一行需要反转才能得到顺时针90度的效果。不过,或者是不是先转置再翻转列?可能我之前记混了,需要再确认一下。比如,原矩阵的行索引i,j,转置后变成j,i,然后翻转行的话,每个行的元素顺序会被反转,这样组合起来应该就是顺时针旋转90度了。
然后,编写代码的话,如何实现转置?可以用zip(*matrix),但要注意在Python 3中zip返回的是元组,所以需要转换成列表。然后翻转每一行。比如,转置后的矩阵的每一行进行反转,就能得到顺时针旋转后的结果。
另外,用户提到的是奇数阶方阵,可能不需要特殊处理奇偶性,因为转置和翻转行的操作对任何阶数的方阵都适用。不过用户可能误以为需要奇数阶,但实际代码应该适用于所有n阶方阵。
然后,关于旋转m次,需要循环m次,每次应用一次旋转操作。但根据取模优化,只需要循环m%4次。比如m=0的话,直接返回原矩阵。
接下来,测试一下示例是否正确。比如,输入一个3x3的矩阵:
1 2 3
4 5 6
7 8 9
顺时针旋转一次后应该变成:
7 4 1
8 5 2
9 6 3
转置后的矩阵是:
1 4 7
2 5 8
3 6 9
然后翻转每一行,得到:
7 4 1
8 5 2
9 6 3
看起来是对的。那两次旋转的话,相当于180度,也就是转置并翻转两次。或者,直接旋转两次的话,每次都是转置加翻转行,两次的结果是否正确?
或者,可能有其他方法,比如转置后翻转列,或者先翻转列再转置,这需要再仔细确认步骤是否正确。比如,另一种方法可能是先翻转每一行,然后转置,这样也能达到顺时针旋转的效果?或者是不是转置之后翻转每一行?
这个时候可能需要查阅一下正确的顺时针旋转方法。比如,正确的顺时针旋转90度的数学步骤是转置矩阵然后水平翻转每一行。或者转置之后反转每一行?比如,原矩阵转置后,每一行原本是列,所以反转行元素即可。例如:
原矩阵:
1 2 3
4 5 6
7 8 9
转置后变成:
1 4 7
2 5 8
3 6 9
然后每一行反转,得到:
7 4 1
8 5 2
9 6 3
是的,这就是顺时针旋转90度的结果。所以正确的步骤是先转置,然后反转每一行。
那代码实现的话,一次旋转的函数可以这样写:
def rotate_once(matrix):
# 转置
transposed = list(zip(*matrix))
# 转换为列表的列表,并反转每一行
rotated = [list(row[::-1]) for row in transposed]
return rotated
然后,对于m次旋转,需要调用这个函数m次。但考虑到效率,特别是当m很大的时候,应该取模4。例如,m = m %4,这样最多旋转3次,减少计算次数。
现在,用户要求输入是一个方阵和旋转次数,输出是旋转后的矩阵。那函数的参数应该是一个二维列表和一个整数m。然后返回旋转后的二维列表。
然后,编写主函数的话,可能包括读取输入矩阵,处理旋转次数,然后应用旋转函数m%4次。比如:
def rotate_matrix(matrix, m):
m = m %4 # 优化旋转次数
for _ in range(m):
matrix = rotate_once(matrix)
return matrix
那测试一下这个函数是否正确。比如,原矩阵旋转4次应该回到原样。例如,第一次旋转得到的结果,再旋转三次(总共四次)就会复原。
现在,关于用户提到的输入输出,需要确保输入的矩阵是方阵,即行数和列数相等。所以在函数中可能需要先检查矩阵是否为方阵,否则抛出异常或者处理错误。但用户的问题中特别说明是奇数阶方阵,可能他们已经有检查,但代码中最好加上验证。
例如,在函数开始时检查是否所有行的长度等于矩阵的行数:
n = len(matrix)
for row in matrix:
if len(row) !=n:
raise ValueError("Matrix must be square")
或者,如果用户提供的输入确保是方阵,可能不需要这一步。但作为通用代码,应该包含检查。
不过根据引用中的内容,比如引用[1]提到输入的矩阵必须是二维的方阵,所以可能需要处理这个前提条件。
现在,用户给的示例代码可能是什么样的?比如,输入矩阵是[[1,2,3],[4,5,6],[7,8,9]],旋转次数1次,输出应该是[[7,4,1],[8,5,2],[9,6,3]]。
此外,旋转多次的情况,比如旋转两次,即180度,是否正确?
原矩阵:
1 2 3
4 5 6
7 8 9
第一次旋转后的结果:
7 4 1
8 5 2
9 6 3
第二次旋转的话,再次应用rotate_once函数:
转置后的矩阵是:
7 8 9
4 5 6
1 2 3
然后反转每一行得到:
9 8 7
6 5 4
3 2 1
所以,两次旋转后的结果应该是:
9 8 7
6 5 4
3 2 1
但根据顺时针旋转180度的正确结果应该是:
9 8 7
6 5 4
3 2 1
所以两次旋转是正确的。那代码应该正确。
现在,编写完整的Python代码,包括处理输入矩阵和旋转次数,并返回结果矩阵。例如:
def rotate_once(matrix):
# 转置矩阵
transposed = list(zip(*matrix))
# 反转每一行并转换为列表
rotated = [list(row[::-1]) for row in transposed]
return rotated
def rotate_matrix(matrix, m):
m = m % 4
for _ in range(m):
matrix = rotate_once(matrix)
return matrix
# 示例使用
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
m = 1
result = rotate_matrix(matrix, m)
for row in result:
print(row)
运行这个示例应该输出:
[7, 4, 1]
[8, 5, 2]
[9, 6, 3]
看起来是正确的。
但是,需要注意的是,每次旋转都会生成一个新的矩阵,而不是在原矩阵上修改。这可能会影响性能,但考虑到Python中列表的可变性,这样做是安全的。例如,原矩阵不会被修改,而是每次返回新的矩阵。这符合函数式编程的习惯,但需要注意空间复杂度。不过对于大多数应用来说,这应该是可以接受的。
此外,用户的问题中提到输入输出分别为矩阵和旋转次数,示例代码需要符合这个要求,即函数接收矩阵和m,返回旋转后的矩阵。
现在,还需要考虑输入的矩阵是否为方阵。所以在函数中可以添加检查:
def rotate_matrix(matrix, m):
n = len(matrix)
for row in matrix:
if len(row) != n:
raise ValueError("Matrix must be square")
m = m %4
# 剩余代码同上
这样可以确保输入正确。
综上,最终的Python代码应该包含这些部分:检查方阵,旋转m次,每次旋转通过转置和反转行来实现。同时,处理旋转次数的优化。然后返回旋转后的矩阵。</think>要實現n階方陣順時針旋轉m次的功能,可以通過矩陣轉置和行翻轉的組合操作來完成。以下是具體實現步驟及Python代碼:
### 方法分析
1. **單次旋轉原理**:順時針旋轉90度可分解為兩個操作
- **轉置**:將矩陣的行列互換
- **行翻轉**:翻轉每一行的元素順序
$$ \text{旋轉後矩陣} = (\text{原矩陣}^T)_{\text{行翻轉}} $$[^1]
2. **多次旋轉優化**:旋轉4次後矩陣恢復原狀,因此只需計算$m \mod 4$次實際旋轉[^2]
### Python實現
```python
def rotate_once(matrix):
"""執行單次順時針旋轉90度"""
# 轉置矩陣(行列互換)
transposed = list(zip(*matrix))
# 翻轉每一行並轉換為列表
return [list(row[::-1]) for row in transposed]
def rotate_matrix(matrix, m):
"""執行m次順時針旋轉"""
# 驗證方陣
n = len(matrix)
for row in matrix:
if len(row) != n:
raise ValueError("輸入必須是方陣")
# 計算有效旋轉次數
m = m % 4
# 執行旋轉操作
for _ in range(m):
matrix = rotate_once(matrix)
return matrix
# 示例使用
if __name__ == "__main__":
# 輸入3x3矩陣
input_matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
rotations = 1
# 執行旋轉
result = rotate_matrix(input_matrix, rotations)
# 輸出結果
for row in result:
print(row)
"""
輸出:
[7, 4, 1]
[8, 5, 2]
[9, 6, 3]
"""
```
### 關鍵要點說明
1. **轉置操作**:`zip(*matrix)`實現行列互換,需轉換為列表
2. **行翻轉**:`row[::-1]`反向切片實現元素翻轉
3. **性能優化**:通過取模減少實際旋轉次數,時間複雜度為$O(n^2 \cdot (m \mod 4))$
### 驗證測試
| 旋轉次數 | 等效角度 | 結果特徵 |
|----------|----------|-----------------------|
| 1 | 90度 | 第一列變為倒序第一行 |
| 2 | 180度 | 行列完全逆序 |
| 3 | 270度 | 第一行變為倒序第一列 |
阅读全文
相关推荐















