题目分析:
该题是对一个输入的矩阵逆时针旋转之后求得到的矩阵,对于矩阵想到可以使用二维数组,但是这里的题目要求则不能使用数组天然的位序,(关于数组天然位序的应用,可以查看我的博客:https://blog.csdn.net/AIMINdeCSDN/article/details/103347659) ,那么关键就在于对二维数组的构造,以及旋转操作,分析逆时针旋转可以发现,行序变列序,也就是说,第一行在实际输出时需要按第一列输出,但是问题在于第一列他不能直接输出,所以可以从行数末尾从后往前输出,先减小行数再减小列数,使用二重循环来实现。
C语言源程序:
#include<stdio.h>
int main()
{
int m,n,i,j,v;
scanf("%d%d",&m,&n);
short num[m][n];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%hd",&v);
num[i][j]=v;
}
}
//先减小行数在减小列数
while(j--)
{
//行数要从前往后
for(i=0;i<m;i++)
{
printf("%hd ",num[i][j]);
}
printf("\n");
}
return 0;
}
在上述程序中,对于数组的定义是可以直接将scanf赋值后的变量作为声明的,还可以直接在定义数组前将并阿联复制也是一样的效果,下面时用define定义的最大数组长度,但是当我使用int定义数组变量时发现,C语言中不能容纳1000*1000的int型数组,随后我又改为short型才正确通过。
#include<stdio.h>
#define N 1000
int mmain()
{
int m,n,i,j,v;
//数组类型需要改为short型
short num[N][N];
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%hd",&v);
num[i][j]=v;
}
}
while(j--)
{
for(i=0;i<m;i++)
{
printf("%hd ",num[i][j]);
}
printf("\n");
}
return 0;
}