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;
}

  

转载于:https://www.cnblogs.com/lyqlyq/p/7223674.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值