蚊香数组问题解决

1 2 3

8 9 4

7 6 5

给定一个数字N,求出如图所示的一个表格,输出。

#include <stdio.h>
#include <stdlib.h>




int get_q(int x,int y,int n)
{
    int min = 9999999L;
    if(x<min) min=x;
    if(y<min) min=y;
    if((n-x-1)<min) min=n-x-1;
    if((n-y-1)<min) min=n-y-1;
    return min;
}

//获取第q全之前的全部编号
int get_b(int q,int n)
{
    return 2*q*(2*n-2*q);
}
//获取
int get_i(int x,int y,int n,int q)
{
    if(x==q)
        return (y-x+1);
    if(y==(n-q-1))
        return (n-q-q-1)*1+x-q+1;
    if(x==(n-q-1))
        return (n-q-q-1)*2+n-q-y;
    if(y==q)
        return (n-q-q-1)*3+n-q-x;
}


int get_x_y(int x,int y,int n)
{
    int q=get_q(x,y,n);
    return get_b(q,n)+get_i(x,y,n,q);
}

int main()
{
    int n;
    scanf("%d",&n);

    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%5d",get_x_y(i,j,n));
        printf("\n");
    }
    return 0;
}

不需要新建数组的算法,时间复杂度O(N^2),空间复杂度O(1)。

算法思路:

直接求在n的情况下,数组F[X][Y]所对应的值。先求X,Y坐标所在的圈数。根据圈数R,算出第R圈之前的全部数字有多少个。

第二部,计算该坐标在第R圈的第几个,那么这个坐标的值就是R圈之前的数字个数+在第R圈的第几个。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值