当前位置: 首页 > news >正文

方阵循环右移或左移类题型

方阵循环右移或左移类题型

一、核心结论(背这一页就够)
对 n 阶方阵,循环移动只看行 i、列 j:

  1. 整行 循环右移 m 列(你刚才那题)
    新矩阵第 j 列 ← 原来的列:
    c

old_j = (j - m + n) % n;
b[i][j] = a[i][old_j];

  1. 整行 循环左移 m 列
    c

old_j = (j + m) % n;
b[i][j] = a[i][old_j];

  1. 整列 循环下移 m 行
    c

old_i = (i - m + n) % n;
b[i][j] = a[old_i][j];

  1. 整列 循环上移 m 行
    c

old_i = (i + m) % n;
b[i][j] = a[old_i][j];

二、一句话理解
右移 / 下移:后面的跑到前面去
左移 / 上移:前面的跑到后面去
+n 是为了防止下标变负
%n 是为了实现循环

三、最标准通用代码框架
c

include <stdio.h>

define N 6

int main() {
int m, n;
int a[N][N], b[N][N];

  scanf("%d %d", &m, &n);// 输入矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {scanf("%d", &a[i][j]);}}// ======================// 这里替换成你要的移动方式// ======================// 例:循环右移 m 列for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int oldj = (j - m + n) % n;b[i][j] = a[i][oldj];}}// 输出for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {printf("%d ", b[i][j]);}printf("\n");}return 0;

}

四、考试必避坑
1.m 可能大于 n
最好先取模:
c

m = m % n;

2.一定用两个数组 a 和 b
不要原地覆盖,容易错。
3.是每行独立移动,不是整个矩阵斜着滚。