★ 输入文件:matrixc.in
输出文件:matrixc.out
简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
MLE:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=10010;
long long a[N][N];
int n,x,y;
int main()
{
freopen("matrixc.in","r",stdin);
freopen("matrixc.out","w",stdout);
scanf("%d%d%d",&n,&x,&y);
long long tot=0;
int i=1,j=0;
long long nn=n*n;
while(1)
{
while((++j)<=n&&!a[i][j])
a[i][j]=(++tot);
j--;
while((++i)<=n&&!a[i][j])
a[i][j]=(++tot);
i--;
while((--j)>=1&&!a[i][j])
a[i][j]=(++tot);
j++;
while((--i)>=1&&!a[i][j])
a[i][j]=(++tot);
i++;
if(tot>=nn)
{
printf("%d",a[x][y]);
return 0;
}
}
return 0;
}
找规律:
#include<stdio.h>
int main()
{ freopen("matrixc.in","r",stdin);
freopen("matrixc.out","w",stdout);
int n,i,j;
int m;//m表示总共的层数
int k,p,q;//循环变量
int flag=0;//标志性变量:等于0表示尚未循环到目标元素(i,j)
int t;
int len;
scanf("%d%d%d",&n,&i,&j);
m=(n+1)/2; //m表示总共的层数
t=1; //t表示要填进数组的数字
for(k=1;k<=m&&flag==0;k++)
{
p=k,q=k; //(k,k)是第k层左上角坐标点
len=n-2*(k-1);//表示当前层中每一条边的元素个数
for(;q<=(k+len-1);q++)//填充当前层的顶边
{
if(p==i&&q==j)
{
printf("%d\n",t);
return 0;
}
t++;
}
q--;
p++;
for(;p<=(k+len-1);p++)//填充当前层的右边
{
if(p==i&&q==j)
{
printf("%d\n",t);
return 0;
}
t++;
}
p--;
q--;
for(;q>=k;q--)//填充当前层的下边
{
if(p==i&&q==j)
{
printf("%d\n",t);
return 0;
}
t++;
}
q++;
p--;
for(;p>k;p--)//填充当前层的左边
{
if(p==i&&q==j)
{
printf("%d\n",t);
return 0;
}
t++;
}
}
return 0;
}