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

一、核心结论(背这一页就够)
对 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.是每行独立移动,不是整个矩阵斜着滚。

posted on 2026-04-21 21:00  谢天佑  阅读(6)  评论(0)    收藏  举报