1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。

时间:2021-01-23 22:15:23

1.6给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。

解答1.6

图片的旋转可以将像素划分成一圈一圈,然后从最外层一圈一圈上来旋转。旋转某一圈的某个元素的时候,相当于对应的上下左右依次交换。

1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。

1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。  1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。 ===>>1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。1.6 给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。

void Rotate90(int mat[N][N])
{
int first,last;
int top,offset;
for (int layer=0;layer<N/2;layer++)
{
first=layer;
last=N-1-first;
//顺时针
for (int i=first;i<last;i++)
{
offset=i-first;
top=mat[first][i];//保存上
mat[first][i]=mat[last-offset][first];//上<----------左

mat[last-offset][first]=mat[last][last-offset];//左<----------下

mat[last][last-offset]=mat[i][last];//下<----------右
mat[i][last]=top;//右<----------上

}
}
/*
//逆时针
for (int layer=0;layer<N/2;layer++)
{
first=layer;
last=N-1-first;
for (int i=first;i<last;i++)
{
offset=i-first;
top=mat[first][i];//保存上
mat[first][i]=mat[i][last];//上<----------右
mat[i][last]=mat[last][last-offset];//右<----------下
mat[last][last-offset]=mat[last-offset][first];//下<----------左
mat[last-offset][first]=top;//左<----------上

}
}
*/
}

注意:关于函数参数为二维数组的情况:

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指定所有维数的大小,也可以省略第一维的大小说明,如:              

void  Func(int array[3][10]);            

 void  Func(int array[][10]);              

二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

 void  Func(int  array[][]); 

因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放), 而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:

void  Func(int  array[3][]);

实参数组维数可以大于形参数组,例如实参数组定义为:

               void  Func(int array[3][10]);

而形参数组定义为: int  array[5][10];  

这时形参数组只取实参数组的一部分,其余部分不起作用。



相关题目:输入n*n的字符矩阵,把它旋转90度后输出

#include <stdio.h>
#include <malloc.h>

void main()

{
char **p;
int i,j,n,a;
printf("请输入n*n矩阵的n值:");
scanf("%d",&n);
getchar();
p = (char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++)
{
p[i] = (char*)malloc(n*sizeof(char));
for(j=0;j<n;j++)
{
p[i][j] = getchar();
}
getchar();//换行输入,去掉回车符的影响
}//动态分配n*n的数组空间,并逐行输入字符串

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%c",p[i][j]);
}
printf("\n");
}

printf("请输入选择方向\n1.顺时针\n2.逆时针\nmake your choice!(1 or 2)\n");
scanf("%d",&a);
switch(a)
{
case 1:
printf("顺时针旋转90后的矩阵为: \n");
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
printf("%c ", p[n-1-j][i]);
printf("\n");
}
break;
case 2:
printf("逆时针旋转90后的矩阵为: \n");
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
printf("%c ",p[j][n-1-i] );
printf("\n");
}
break;
default:
printf("input error!\n");
break;
}
}


 

如上已测试运行成功,

输入 2

ab

cd

1    //选择1顺时针输出

ca

bd

2    //选择2逆时针输出

bd

ac

 

 

中间有空格模式的话,再输入过程修改成空格输入即可。

scanf函数族在用%c接受输入时要接收空格和回车。%s时接受空格。getchar函数族接受所有字符包括回车。

for(i=0;i<n;i++)
{
p[i] = (char*)malloc(n*sizeof(char));
for(j=0;j<n;j++)
{
p[i][j] = getchar();
                        getchar();//接收空格或者回车符号}}//动态分配n*n的数组空间,并逐行输入字符串