如何实现以个二维数组就地旋转不用到其他空间呢?
那要先想想一个二维数组需要几次调整才能使他转90度。
我们拿一个3*3的二维数组居例子
首先我们定义个一二维数组,是这样的
1 2 3
4 5 6
7 8 9
那么第一步(对角线交换)
1 4 7
2 5 8
3 6 9
乍一看可以看出来就是 横坐标和纵坐标交换就可以了;
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
{
t = Mat[i][j];
Mat[i][j]=Mat[j][i];
Mat[j][i]=t;
}
}
第二步
第一列和最后列交换一下就可以了
若不是3*3的数组,我们可以用这个推出前面一列为j 最后一列为N-j-i(N为数组行列的大小)
for(j=0;j<N/2;j++) //这里的N/2 ,是因为只需要前面一半和后面的一半交换,不然就换回来了
{
for(i=0;i<N;i++)
{
t = Mat[i][j];
Mat[i][j]=Mat[i][N-j-1];
Mat [i][N-j-1]=t;
}
最终的代码就这样了
#include<stdio.h>
#include<malloc.h>
void fun(int **Mat,int N);
int main()
{
int N,**Mat,i,j;
printf("请输入二维数组的行和列的大小:\n");
scanf("%d",&N);
Mat = (int**)malloc(N*sizeof(int*));//这里生成,第一维数组,Mat存放元素的首地址
for(i=0;i<N;i++)
{
Mat[i]=(int*)malloc(N*sizeof(int)); //生成,第二维数组,
}
printf("请输入二维数组各个元素:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&Mat[i][j]);
}
}
fun(Mat,N);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%3d",Mat[i][j]);
}
printf("\n");
}
return 0;
}
void fun(int **Mat,int N)
{
int t,i,j,k=N;
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
{
t = Mat[i][j];
Mat[i][j]=Mat[j][i];
Mat[j][i]=t;
}
}
for(j=0;j<N/2;j++)
{
for(i=0;i<N;i++)
{
t = Mat[i][j];
Mat[i][j]=Mat[i][N-j-1];
Mat [i][N-j-1]=t;
}
return;
}
}
yep!