CCF CSP201503-1图像旋转

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

#include<iostream>
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系统在做测试的时候应该就是输入了在 评测用例规模与约定中较大的数据,导致程序运行错误,然后我去网上查了下

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

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

#include<iostream>
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++一无所知。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值