方阵循环右移

发布时间:2023年12月18日

本题要求编写程序,将给定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;
}
文章来源:https://blog.csdn.net/2301_80173477/article/details/134951683
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。