CCF CSP201503-1图像旋转

在备考CCF CSP认证的过程中,做了这么一道题
CCF CSP201503-1图像旋转_第1张图片
一开始我自己是这样写的,定义的数组是需要的大小,而且只有输入输出语句,没有额外运算和内存开销,不管是时间复杂度还是空间复杂度都应该是最优的,但是提交评分只有80分,系统显示运行错误,我仔细思考了很久,一度怀疑是不是CCF测评系统有问题,对于这个程序没有发现一点错误。

#include
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int num[n][m];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>num[i][j];

	for(int i=m-1;i>=0;i--)
	{
		for(int j=0;j<n;j++)
			cout<<num[j][i]<<" ";
		cout<<endl;
	}
	return 0;	
}

后来我在网上仔细搜了这题,发现都是采用全局定义1000个元素的数组,然后在devcpp上试了下输入的m,n都是1000,然后出现下面这种情况:
CCF CSP201503-1图像旋转_第2张图片
在输入数据很大时程序运行出错;
我猜想CCF系统在做测试的时候应该就是输入了在 评测用例规模与约定中较大的数据,导致程序运行错误,然后我去网上查了下

全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的。(c语言程序在运行时会动态创建一个堆栈段,里面存放着调用栈,保存着函数的调用关系和局部变量。)如果数组太大,可能会造成栈溢出。

也就是说在main函数里面定义的数据导致了栈溢出;
最后我改成全局定义1000000个数据的数组,修改的程序如下:

#include
using namespace std;
int num[1000][1000];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>num[i][j];

	for(int i=m-1;i>=0;i--)
	{
		for(int j=0;j<n;j++)
			cout<<num[j][i]<<" ";
		cout<<endl;
	}
	return 0;	
}

程序依然只有输入和输出语句,这次运行成功100分!
但是空间复杂度增加,虽然符合题目要求,但是多了不必要的内存开销。
每一个错误都必定是自己某个方面没考虑到,都必定是知识的残缺环节,犯了那么多错我才发现其实我对C++一无所知。

你可能感兴趣的:(CCF,CSP备考刷题)