昨天去参加了迅雷的笔试,主要分为客观题和主观题,客观题无非就是选择填空,但是很恶心的选择题有多选;主观题就是给个算法题目,让你写出代码。
矩阵的逆时针旋转90°就是一道主观题,并且题目要求不能用额外空间,当时我脑子蒙了,不会,回来搜了一下,但是那个方法太繁琐了,下标操作很复杂,
就算让我看了,然后再写一遍,我估计都比较困难,下边是网上的代码:
/*输入N阶矩阵,逆时针旋转90°*/
#include<stdio.h>
#include<stdlib.h>
#define N 20
int 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 20
int 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;
}
给个结果图吧
哎,看来学好数学还是很重要滴~~~~~