#include <stdio.h>
int main(){
int m, n,i,j;
scanf("%d %d", &m, &n);
int s[n][n];
for(i = 0; i <= n - 1; i++)
for(j = 0; j <= n - 1; j++)
scanf("%d", &s[i][(j + m)%n]);
for( i = 0; i <= n - 1; i++) {
for(j = 0; j <= n - 1; j++) {
if( j <= n - 2 )
printf("%d ", s[i][j]);
else
printf("%d \n", s[i][j]);
}
}
return 0;
}
这个代码是怎么实现将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。的,我不太懂
i是行坐标,j是列坐标,所以向右移动m只要j+m,假设n=5,m=1,在最后一个元素下标4向右移时会超出到5的位置,实际上它应该是移动第一个位置也就是j=0的地方,所以(j+m)%n,%n能保证使得超出的从第一个位置往右移