本题要求编写程序,将给定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个整数,每个整数后输出一个空格。
2 3
1 2 3
4 5 6
7 8 9
2 3 1?
5 6 4?
8 9 7?
写法一(复杂但清晰)
#include<stdio.h>
void Input(int arr[6][6], int n)
{
int j, k;
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
scanf("%d", &arr[j][k]);
}
}
}
void Move1(int arr[6][6], int m,int n)
{
int j, k;
int ch[6][6];
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
if (k < m)
{
ch[j][k] = arr[j][k];
arr[j][k] = arr[j][n - m + k];
//移动具体对应哪个数,n,m,k之间的关系,自己写俩矩阵琢磨琢磨,我解释不了
}
else//else中也要记得复制一遍原函数
{
ch[j][k] = arr[j][k];
arr[j][k] = ch[j][k - m];
}
}
}
}
void Output(int arr[6][6], int n)
{
int j, k;
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
printf("%d ", arr[j][k]);
}
printf("\n");
}
}
int main(void)
{
int m, n;
int arr[6][6];
scanf("%d%d", &m, &n);
Input(arr, n);
if (m < n&&m>0)
{
Move1(arr, m, n);
Output(arr, n);
}
else//考虑n的最小值;考虑m与n的大小关系
{
if (m==0||m % n == 0 || n == 1)
{
Output(arr, n);
}
else if (m % n != 0)
{
m = m % n;
Move1(arr, m, n);
Output(arr, n);
}
}
return 0;
}
方法二(简洁但较难懂):
#include <stdio.h>
void Move1(int n, int m, int arr[6][6])
{
int temp[6][6];
int i, j;
// 复制矩阵
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
temp[i][j] = arr[i][j];
}
}
// 向右移动m个位置
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
arr[i][(j + m) % n] = temp[i][j];
}
}
}
int main()
{
int n, m;
int arr[6][6];
int i, j;
scanf("%d%d", &m, &n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
if (n % m == 0)
{
for (i = 0; i < n / m; i++)
{
for (j = 0; j < m; j++)
{
// 循环移动m个位置
Move1(n, m, arr);
}
}
}
else
{
// 循环移动m个位置
Move1(n, m % n, arr);
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}