算法面试题三

时间:2021-10-20 19:04:12

螺旋队列问题:

看清一下数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正,列如7的坐标是(-1,-1),2的坐标是(0,1),3的坐标是(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字。

21 22 ,......
20   7   8   9  10
19   6   1   2  11
18   5   4   3  12
17 16 15 14  13


代码如下:

typedef struct{
int x;
int y;
}Point;

int getValue(Point point){
int r = abs(point.x)>abs(point.y)?abs(point.x):abs(point.y);//当前点x,y的最大绝对值
int ri=2*r-1;//边长比当前正方形小的正方形上最大数
int distance;
//根据上下左右方向计算该点到该所在正方形上初始点的距离
//右边
if(point.x==r&&point.y!=-r){
distance=point.y-(1-r)+1;
}
//下
else if(point.y==r){
distance=2*r-1+r-point.x+1;
}
//左
else if(point.x==-r){
distance=2*r-1+2*r+r-point.y+1;
}
//上
else{
distance=2*r-1+2*r*2+point.x+r+1;
}
return (distance+ri*ri);
}

int main(int argc, char *argv[])
{
Point point={2,-2};
cout<<getValue(point)<<endl;

getchar();
return 0;
}