#include
class Array{
private:
int a[4][4];
public:
Array(int a1[][4],int n)
{
for(int i=0;i
{
for(int j=0;j<4;j++)
a[i][j]=a1[i][j];
}
}
void xuanzhuan();
void show();
};
void Array::xuanzhuan()//实现对方阵a进行逆时针90度的旋转;
{
int i,j;
int t[4][4];//定义临时数组,用于保存原始方阵经逆时针90度旋转后对应下标上的值;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
t[3-j][i]=a[i][j];//将旋转后对应下标上的值赋给临时数组上的对应位置;
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
a[i][j]=t[i][j];//将保存在临时数组的值,赋给原始数组,从而原始数组完成旋转;
}
}
void Array::show()//输出;
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
cout<
cout<
}
}
void main()//测试;
{
int b[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
Array test(b,4);
cout<<"原始方阵为:"<
test.show();
test.xuanzhuan();
cout<<"进行逆时针90度旋转后的方阵为:"<
test.show();
}
总共就这t[3-j][i]=a[i][j];一句值钱
这就是画个网格找规律,比如右上角a[0][3],旋转后位置是t[0][0],左侧的a[0,2],旋转后是t[1,0],其下方的a[1][2],旋转后是t[1][1],所以规律就是a的i值,变成了t的j值,然后a的j值与t的i值之和为数组的最大小标与最小下标之和3
先看下图:
思路:
逆时针旋转90°后,原来的第一行变为第一列,原来的第二行变为第二列,所以 t 的列即为原来a 的行,所以,对t的每个元素,列元素跟a的行元素是对应的,即:
t[][i] = a[][j] //a的行变为t的列
再观察,旋转后,原来的a的第1行第1列元素变为t的第4行第1列数据,原来a的第1行第2列数据变为t的第3行第1列数据,所以,对t的每个元素,行元素跟a的原来的列是逆序的,即:
t[3-j][] = a[i]
综合上面的,t[3 - j][i] = a[i][j] 即可将矩阵逆转90度。
流程图:
流程图左边的双层for循环用于逆时针旋转90度,右边的双层for循环用于把t的数据重新赋值给a