螺旋队列

本文介绍了一种将二维坐标映射为唯一整数的方法,并提供了两种不同的实现方式。通过定义特定的数学公式,该算法能确保任意一对坐标对应唯一的整数,适用于需要对坐标进行编码的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<cstdio>
#include<iostream>
using namespace std;
#define abs(a) ((a)>0?(a):-(a))
#define max(a,b) ((a)<(b)?(b):(a))
int foo(int x,int y){
    if(x==0&&y==0) return 1;
    int t=max(abs(x),abs(y));
    int t1=((t-1)*2+1)*((t-1)*2+1);
    int t2=((t)*2+1)*((t)*2+1);
//    printf("t1=%d,t2=%d\n",t1,t2);
    if(x+y>0&&x>=y) return t1+x+y;
    if(x+y>=0&&x<y) return t1-x-y+4*t;
    if(x+y<=0&&x>=y) return t2+x+y;
    if(x+y<0&&x<y) return t2-x-y-4*t;
    return 0;
}
//第二种 按坐标轴上的数为基准
int foo2(int x,int y){
    int t=max(abs(x),abs(y));
    int u=t+t;
    int v=u-1;
    v=v*v;
    int v1=v+t;
    int v2=v1+2*t;
    int v3=v2+2*t;
    int v4=v3+2*t;
    if(y==-t) return v4+x;
    else if(y==t) return v2-x;
    else if(x==-t) return v3-y;
    else if(x==t) return v1+y;
}
int main()
{
    for(int y=-4;y<=4;y++){
        for(int x=-4;x<=4;x++)
            printf("%5d",foo2(x,y));
            printf("\n");
    }
    int x,y;
    while(scanf("%d%d",&x,&y)==2){
        printf("%d\n",foo(x,y));
    }

    return 0;
}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值