題目分析:
該題是對一個輸入的矩陣逆時針旋轉之後求得到的矩陣,對於矩陣想到可以使用二維數組,但是這裏的題目要求則不能使用數組天然的位序,(關於數組天然位序的應用,可以查看我的博客: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;
}