算法面试题三

螺旋队列问题:

看清一下数字排列的规律,设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;
}

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/crzy_sparrow/article/details/7429102
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞