本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。 输入格式: 输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。 输出格式: 按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
时间: 2023-05-31 08:18:01 浏览: 172
### 回答1:
题目描述
给定n×n方阵中的每个元素循环向右移m个位置,即将第、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
样例
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
算法1
(暴力枚举) $O(n^2)$
先将每一列存入一个数组,然后将数组循环右移m个位置,最后再将每一列输出即可。
时间复杂度
参考文献
python3 代码
C++ 代码
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
### 回答2:
本题需要先将每一列向右移动m个位置,然后将变换后的整个矩阵输出。
首先,我们将矩阵中第j列的元素依次赋值给第j+m列,注意循环时需要对列数取模,实现循环移动的效果。这里可以使用一个临时数组,将第j列的元素先保存下来,再赋值给第j+m列。
接下来按照输入格式输出移动后的矩阵即可。实现代码如下:
```python
m, n = map(int, input().split())
matrix = []
for i in range(n):
row = list(map(int, input().split()))
matrix.append(row)
# 循环移动每一列
for j in range(n):
tmp = matrix[0][j]
for i in range(n):
next_index = (i + m) % n
matrix[next_index][j] , tmp = tmp, matrix[next_index][j]
# 输出移动后的矩阵
for row in matrix:
print(' '.join(str(i) for i in row))
```
对于移动的操作,还有一种巧妙的方法:将整个矩阵先转置,然后对每一行循环移动m个位置,再将矩阵转置回来即可。这种方法可以省略掉临时数组的使用,但需要注意循环时需要对行数取模。实现代码如下:
```python
m, n = map(int, input().split())
matrix = []
for i in range(n):
row = list(map(int, input().split()))
matrix.append(row)
# 转置矩阵
for i in range(n):
for j in range(i, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
# 循环移动每一行
for i in range(n):
start_index = n - m % n # 计算移动后的起始列
matrix[i] = matrix[i][start_index:] + matrix[i][:start_index]
# 转置矩阵
for i in range(n):
for j in range(i, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
# 输出移动后的矩阵
for row in matrix:
print(' '.join(str(i) for i in row))
```
### 回答3:
这道题可以分为两个部分,一个是对方阵进行移位操作,另一个是输出移位后的方阵。
首先,来看如何进行移位操作。我们可以将方阵看成若干个圆圈,每个圆圈移动m个位置。比如,一个3阶方阵可以看成3个圆圈,分别是第一行第二行第三行,每个圆圈都要向右移动m个位置。
如图:
![image.png](https://cdn.luogu.com.cn/upload/image_hosting/ed8yh5mt.png)
首先对每个圆圈进行移位操作,这可以用list的切片操作实现。然后将所有圆圈按照顺序组合成一个新的方阵即可。
代码如下:
```python
m, n = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)] # 读入方阵
# 对每个圆圈进行移位操作
for i in range(n):
row = matrix[i]
matrix[i] = row[-m:] + row[:-m]
# 组合新的方阵
new_matrix = []
for j in range(n):
col = []
for i in range(n):
col.append(matrix[i][j])
new_matrix.append(col)
# 输出新的方阵
for row in new_matrix:
print(' '.join(map(str, row)))
```
这里用了两个循环,分别对每个圆圈进行移位操作,以及组合新的方阵。其中注意每个圆圈的边界情况。
最后输出移位后的方阵即可。
完整代码如下:
阅读全文