华为2019校招笔试题之旋转方阵(C语言版、python)

2023-05-16

题目描述:
– 输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵
– 旋转举例:(如下四个三阶方阵从上到下为数字围绕中心顺时针旋转
1 2 3
4 5 6
7 8 9

7 4 1
8 5 2
9 6 3

9 8 7
6 5 4
3 2 1

3 6 9
2 5 8
1 4 7
输入描述:
(1) 输入第一行一个正整数N (0<N<10)
(2) 接下来N行每行N个整数用空格分开,为方阵的数据
(3) 接下来一行一个正整数M (0<=M<=10000)
说明:不用考虑异常输入,所有输入都是正常的,严格遵从取值范围
输出描述:
(1) N行,每行N个整数,用空格分开,为旋转后的数据
示例1:
– 输入
3
1 2 3
4 5 6
7 8 9
2
– 输出
9 8 7
6 5 4
3 2 1

c语言实现:

#include <stdio.h>
#include<string>)
#include <stdlib.h>//包含动态内存分配函数。

void *input(int *p,int n)
{
	int i;
	for (i = 0; i < n*n; i++)
		scanf("%d", &p[i]);//输入第i行第j列的数据。其中&p[i][j]也可以写作p[i]+j或者是 *(p+i) + j. 功能相同。
	for (i = 0; i < n*n;)
	{
		printf("%d ", p[i]);//输出i行j列的元素。
		i++;
		if (i%n == 0)
			printf("\n");//每行输入结束加换行符。
	}
	return p;
}
void *out(int *p, int n)
{
	for (int i = 0; i < n*n; )
	{
		printf("%d ", p[i]);//输出i行j列的元素。
		i++;
		if (i%n == 0)
			printf("\n");//每行输入结束加换行符
	}
	return 0;
}

void *rotate(int *p,int *temp, int t,int n)
{
		int i = 0, j = 0;
			for (; i < n*n; )
			{
				temp[i] = p[n*(n - 1) - n * (i%n) + j];
				i++;
				if (i%n == 0)
					j++;
			}
			t--;
		if (t == 0)
		{
			out(temp, n);
			return 0;
		}
		else
			rotate(temp,p,t,n);
}


int main(void)
{
	int *p,*temp; //定义二维指针
	int n,m,t, i,j;//行数和旋转次数
	printf("输入矩阵维度:");
	scanf("%d", &n); //输入行数和列数
	p = (int *)malloc(sizeof(int *) *n*n);//申请指针空间。
	temp = (int *)malloc(sizeof(int*) *n*n);
	input(p, n);
	printf("输入旋转次数:");
	scanf("%d", &m);
	t = m % 4;
	if (t == 0)
		out(p, n);
	else
		rotate(p, temp, t,n);
//释放内存
	free(p);
	free(temp);
	system("pause");
	return 0;
}

python实现:

def in_num(p, n):
    print("输入矩阵同行数字用空格分隔,不同行则用回车换行:")
    for i in range(n):
        p[i] = input().split(" ")  # //输入二维数组,同行数字用空格分隔,不同行则用回车换行
        p[i] = [int(j) for j in p[i]]  # // 将数组中的每一行转换成整型
    return p
def rotate_out(p, q, m, n):
    for i in range(n):
        for j in range(n):
            q[i][j] = p[n - j - 1][i]
    m = m-1
    if m == 0:
        for i in range(n):
            for j in range(n):
                print((q[i][j]), end= " ")
            print("")
    else:
        rotate_out(q, p, m, n)

n = int(input("输入矩阵维度n:"))        #输入二维数组的行数和列数
p, q = [([0] * n) for _ in range(n)], [([0] * n) for _ in range(n)]       #初始化二维数组
in_num(p, n)
m = int(input("输入旋转次数m:")) % 4
if m == 0:
    for i in range(n):
        for j in range(n):
            print((q[i][j]), end= " ")
        print("")
else:
    rotate_out(p, q, m, n)




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为2019校招笔试题之旋转方阵(C语言版、python) 的相关文章

随机推荐