一道题:
21 22 ....
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
看清以上数字排列的规律,设 1 点的坐标是 (0,0),x 方向向右为正,y 方向向下为正。例如,7 的坐标为 (-1,-1),2 的坐标为 (0,1),3 的坐标为 (1,1)。编程实现输入任意一点坐标 (x,y),输出所对应的数字。
---------------------------------------------------------------------------------------------------------------------------------------------------
解:
先看图,不难发现,每圈的最大值是:(2n+1)^2
4条边上各坐标上的值与max的对应关系为:
上边:topValue = max + ( x + y );
左边: leftValue = max + ( 3x - y );
下边:bottomValue = max + ( -x - 5y );
右边:rightValue = max + ( -7x + y );
-----------------------------------------
图中:topBase = max + y。
是因为 topBase 的值应该是 max - n,而top上的元素 y=-n,所以topBase = max + y,其他Base的值同理。
--------------------------------------
代码实现:
int foo( int x, int y )
{
int result = 0 ;
int n = max( abs(x), abx(y) ) ;
int maxValue = pow(2*n + 1, 2) ;
//判断在哪条边上
if ( y == -n ) //top
{
result = maxValue + ( x + y ) ;
}else if ( x == -n ) //left
{
result = maxValue + ( 3*x - y ) ;
}else if ( y == n ) //bottom
{
result = maxValue + ( -x - 5*y ) ;
}else if ( x == n ) //right
{
result = maxValue + ( -7*x + y ) ;
}
return result ;
}