PAT1050 螺旋矩阵 (25 分)【全部通过 关于段错误的原因 以及测试点7】

心得

思路:一个0~10000的数写成M*N的形式,且M>N,则M的范围是0~10000,N的范围是0~100
这个对于m,n的判断很重要,因为二维数组不能开的太大,10000*10000会显示段错误
几种段错误的原因:数组访问越界,或者数组开得过大
如何判断测试点是几:吸收测试点的total之后,用if判断,二分法,如果大于某数,直接返回(看结果是段错误还是答案错误,再二分)

测试点7是9973!!!

比如下面这个过程:

5000~9999之间没有测试点

1000~5000之间没有测试点

500~1000之间没有测试点

测试点7段错误

测试点7在500之上
测试点7在1000之上
测试点7在2500之上
测试点7在7500之上
测试点7在9500之上
测试点7在9900之上
测试点7在9945之上
测试点7在9968之上
测试点7在9971之上

测试点7不是9971,9972

测试点7是9973!!!

测试点7在9974之下
测试点7在9979之下
测试点7在9990之下

用习惯了VS2017之后,就回不去dev或者其他ide了,vs太好用了啊!尤其是调试功能以及随时报错、语法联想功能!
但是考试的环境没有vs2017,只好提前用dev熟悉一下。这道题是第一道用dev做出的25分题,花了不少时间,但熟悉环境是主要的。也由此说明了不要过分依赖某一个特定的ide(尽管它真的很好用…),况且是在刷算法题,而不是开发一个项目。那些不用ide的控制台党不也一样高效的写代码吗?陌生的ide不应成为设计算法的瓶颈。

题目

PAT1050 螺旋矩阵 (25 分)【全部通过 关于段错误的原因 以及测试点7】

和OJ斗智斗勇

PAT1050 螺旋矩阵 (25 分)【全部通过 关于段错误的原因 以及测试点7】

全部通过

PAT1050 螺旋矩阵 (25 分)【全部通过 关于段错误的原因 以及测试点7】

代码

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;

int mySort(int a1,int a2)
{
	return(a1>a2);
}

int main()
{
	int total;
	cin>>total;
	
	//输入
	int i,j;
	int arr[10000];
	for(i=0;i<total;i++)
	{
		cin>>arr[i];
	} 
	
	//计算m,n   m行n列 
	int m=0,n=0;
	for(i=1;i<=sqrt(total);i++)
	{
		if(total%i==0)
		{
			n=i;
			m=total/n;
		}
	}

	//排序
	sort(arr,arr+total,mySort);
	

	//摆放
	int bi[10000][100];
	int totalFlag=0;
	
	//按圈遍历
	int up=0;
	int down=m-1;
	int left=0;
	int right=n-1; 
	
//	cout<<"m="<<m<<endl;
//	cout<<"n="<<n<<endl;
//	cout<<"up="<<up<<endl;
//	cout<<"down="<<down<<endl;
//	cout<<"left="<<left<<endl;
//	cout<<"right="<<right<<endl;
	
	while(1)
	{
		if(totalFlag==total)break;
		
		//上
		for(i=left;i<=right;i++)
		{
			bi[up][i]=arr[totalFlag];
			totalFlag++;
		}
		if(totalFlag==total)break;
		
		//右 
		for(i=up+1;i<=down;i++)
		{
			bi[i][right]=arr[totalFlag];
			totalFlag++;
		}
		if(totalFlag==total)break;
			
		//下
		for(i=right-1;i>=left;i--)
		{
			bi[down][i]=arr[totalFlag];
			totalFlag++;
		}
		if(totalFlag==total)break;
		
		//左 
		for(i=down-1;i>=up+1;i--)
		{
			bi[i][left]=arr[totalFlag];
			totalFlag++;
		}
		if(totalFlag==total)break;
			
		//改变边界 
		up++;
		down--;
		left++;
		right--;
	} 
	
	//打印
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			cout<<bi[i][j];
			if(j!=n-1)cout<<' ';
		}
		if(i!=m-1)cout<<endl;
	} 
	return 0;
}