1.6给出一张图片,表示为NXN的居然,每个像素点为4字节。写一个函数实现将这张图片旋转90°。
解答1.6:
图片的旋转可以将像素划分成一圈一圈,然后从最外层一圈一圈上来旋转。旋转某一圈的某个元素的时候,相当于对应的上下左右依次交换。
===>>
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的数组空间,并逐行输入字符串