CSP考试 2015年3月第1题 图像旋转 C语言实现

题目分析:

该题是对一个输入的矩阵逆时针旋转之后求得到的矩阵,对于矩阵想到可以使用二维数组,但是这里的题目要求则不能使用数组天然的位序,(关于数组天然位序的应用,可以查看我的博客:https://blog.csdn.net/AIMINdeCSDN/article/details/103347659) ,那么关键就在于对二维数组的构造,以及旋转操作,分析逆时针旋转可以发现,行序变列序,也就是说,第一行在实际输出时需要按第一列输出,但是问题在于第一列他不能直接输出,所以可以从行数末尾从后往前输出,先减小行数再减小列数,使用二重循环来实现。

C语言源程序:

#include<stdio.h> 

int main()
{
	int m,n,i,j,v;
	scanf("%d%d",&m,&n);
	short num[m][n];	
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%hd",&v);
			num[i][j]=v;
		}
	}
         //先减小行数在减小列数
	while(j--)
	{
            //行数要从前往后
		for(i=0;i<m;i++)
		{
			printf("%hd ",num[i][j]);
		}
		printf("\n");
	}
	return 0;
}

在上述程序中,对于数组的定义是可以直接将scanf赋值后的变量作为声明的,还可以直接在定义数组前将并阿联复制也是一样的效果,下面时用define定义的最大数组长度,但是当我使用int定义数组变量时发现,C语言中不能容纳1000*1000的int型数组,随后我又改为short型才正确通过。

#include<stdio.h> 
#define N 1000
int mmain()
{
	int m,n,i,j,v;
    //数组类型需要改为short型
	short num[N][N];
	scanf("%d%d",&m,&n);
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%hd",&v);
			num[i][j]=v;
		}
	}
	while(j--)
	{
		for(i=0;i<m;i++)
		{
			printf("%hd ",num[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章