迅雷笔试题---矩阵逆时针旋转90°

来源:互联网 发布:单片机电流检测电路图 编辑:程序博客网 时间:2024/06/14 09:53

昨天去参加了迅雷的笔试,主要分为客观题和主观题,客观题无非就是选择填空,但是很恶心的选择题有多选;主观题就是给个算法题目,让你写出代码。

矩阵的逆时针旋转90°就是一道主观题,并且题目要求不能用额外空间,当时我脑子蒙了,不会,回来搜了一下,但是那个方法太繁琐了,下标操作很复杂,

就算让我看了,然后再写一遍,我估计都比较困难,下边是网上的代码:

/*输入N阶矩阵,逆时针旋转90°*/#include<stdio.h>#include<stdlib.h>#define N 20int a[N][N];int main(){int i,k,n,j;printf("Enter n<=%d\n",N);scanf("%d",&n);//输入阶数if(n>N){printf("input error\n");exit(0);}for(i=0;i<n;i++)//输入矩阵元素的值for(j=0;j<n;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);printf("\n");}printf("Input the array is:\n");for(i=0;i<n;i++)//打印出输入的矩阵{for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}////////////////////////////////////////////////////////////////////////////第一种方法比较繁琐,不好解决/*逆时针旋转90°的算法*/for(i=0;i<n/2;i++)/*共有n/2个旋转环*/for(k=0;k<n-1-i-i;k++)/*每个旋转环共有n-1-i-i个旋转组,每组4个元素,逐个旋转*/{/*旋转组4个元素,分别是a[i][k+i],a[k+i][n-1-i],a[n-1-i][n-1-i-k]a[n-1-i=k][i]*/int t; t                =a[i][k+i];a[i][k+i]        =a[k+i][n-1-i];a[k+i][n-1-i]    =a[n-1-i][n-1-i-k];a[n-1-i][n-1-i-k]=a[n-1-i-k][i]; a[n-1-i-k][i]    =t; }/*输出旋转后的矩阵*/printf("After rotating the array is:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}system("pause");return 0;        } 


反正我感觉不好记,刚好师妹在旁边,数学功底很强的那种,而且经常跟矩阵之类的打交道,然后我就问了问她,人家连反应都没反应,就说这还不简单,

矩阵主对角线翻转,然后再上下翻转,这让我这师兄顿时惊呆了。。。

废话不多说,上代码,很简单,也不用多记忆!

/*输入N阶矩阵,逆时针旋转90°*/#include<stdio.h>#include<stdlib.h>#define N 20int a[N][N];int main(){int i,k,n,j;printf("Enter n<=%d\n",N);scanf("%d",&n);//输入阶数if(n>N){printf("input error\n");exit(0);}for(i=0;i<n;i++)//输入矩阵元素的值for(j=0;j<n;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);printf("\n");}printf("Input the array is:\n");for(i=0;i<n;i++)//打印出输入的矩阵{for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}////////////////////////////////////////////////////////////////////////////第二种方法,苗苗提供//先按主对角线翻转for (i = 0; i < n; i++){for (j = 0; j <= i; j++){int t = a[i][j];a[i][j] = a[j][i];a[j][i] = t;}}//再上下翻转for (k = 0; k < n/2; k++){for (i = 0; i < n; i++){int t2 = a[k][i];a[k][i] = a[n - 1 - k][i];a[n - 1 - k][i] = t2;}}/*输出旋转后的矩阵*/printf("After rotating the array is:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}system("pause");return 0;        } 
给个结果图吧 


哎,看来学好数学还是很重要滴~~~~~

原创粉丝点击