cogs 1811. [NOIP2014]螺旋矩阵
★ 输入文件: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; }