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不应成为设计算法的瓶颈。
题目
和OJ斗智斗勇
全部通过
代码
#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;
}