Thursday, October 12, 2006

一道网易笔试题

http://blog.csdn.net/chinainvent/archive/2006/10/13/1332494.aspx
如图:
 
设“1”的坐标为(0,0) “7”的坐标为(-1,-1) 编写一个小程序,使程序做到输入坐标(X,Y)之后显示出相应的数字。




#! /usr/bin/env python
def f(x, y):
w = max(abs(x), abs(y))
x += w
y += w
w *= 2

if y == 0:
s = w * 3 + x
elif x == 0:
s = w * 2 + (w - y)
elif y == w:
s = w + (w - x)
else:
s = y
return s + (w - 1) ** 2

for x, y in [(0,0), (0,1), (1,2), (-1,-2), (8, 9)]:
print (x, y), f(x, y)


###################

将问题转化为求一个内部正方形中包含的点的个数与外部正方形的边上的点的个数.
设外部正方形的边长为U(=代码中w*2+1), 则内部正方形内包含的点数为: (U-2)^2,外部正方形边上的点个数求法为代码中的s。

简单解释一下代码:

w = max(abs(x),abs(y));
x += w;
y += w;
w *= 2;

///上面这几句做了坐标变换,便于随后的算术运算。

if (y == 0)
s = 3*w + x;
else if (x == 0)
s = 2*w + (w - y);
else if (y == w)
s = w + (w - x);
else
s = y;

///上面这几句求外部边上的点个数s。

return s + (w-1) ** 2;

///答案为s + 内部正方形内点的个数。

No comments: