螺旋队列问题:
看清一下数字排列的规律,设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;
}