题目描述:不使用其他数组,将下列4阶方阵顺时针、逆时针旋转90°
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
要求输出:
CW:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
CCW:
4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13
这个方阵是用一个二维数组存放的,由于不能使用其他数组,所以我们能做的操作就是将某两个元素位置交换。要做到顺时针旋转,观察数的位置,可以先按对角线交换,然后进行左右交换,即a[i][j]与a[j][i]互换,然后a[i][j]与a[i][n-j]互换,这里的n应该是方阵的阶数减一(此题为3)。
当完成一次顺时针旋转,再观察数的位置,可知只要再对所有元素进行一次中心对称的交换,就可以实现原方阵的逆时针旋转。完整代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int mat[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };//输入数组
printf("Origin:\n");
printf("1 2 3 4\n5 6 7 8 \n9 10 11 12\n13 14 15 16\n");
int temp=0,i,j;
for (i = 0; i <= 3; i++) //关于对角线交换位置
for (j = 0; j <= i; j++)
{
temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
for(i=0;i<=3;i++) //关于中心对称轴交换
for(j=0;j<=1;j++)
{
temp = mat[i][j];
mat[i][j] = mat[i][3 - j];
mat[i][3 - j] = temp;
}
printf("CW:\n"); //第一次输出
for (i = 0; i <= 3; i++)
for (j = 0; j <= 3; j++)
{
printf("%d ", mat[i][j]);
if (j == 3)
printf("\n");
}
for (i = 0; i <= 3; i++) //关于对称中心交换位置
for (j = 0; j <= 1; j++)
{
temp = mat[i][j];
mat[i][j] = mat[3 - i][3 - j];
mat[3 - i][3 - j] = temp;
}
printf("CCW:\n"); //第二次输出
for (i = 0; i <= 3; i++)
for (j = 0; j <= 3; j++)
{
printf("%d ", mat[i][j]);
if (j == 3)
printf("\n");
}
return 0;
}
对于其他方阵,此方法也是适用的。