zz: http://www.strongczq.com/2012/03/srm538-div1-2-div2-3-evenroute.html
题目原文:http://community.topcoder.com/stat?c=problem_statement&pm=11808&rd=14729
题目原文:http://community.topcoder.com/stat?c=problem_statement&pm=11808&rd=14729
题目大意:
直角坐标系上有N个点,坐标用int[] x和 int[]y表示。现在从原点(0,0)出发,每步只能往上下左右四个方向中的一个移动距离1。要求遍历所有的这N个点,并且最终停止在某一个点上。那么,给定一个取值为0或1的数wantedParity,问有没有可能移动的步数奇偶性与
wantedParity相同。
数据规模:N取值为[1,50], 每个坐标值取值为[-1000000, 1000000]。
思路:
这道题具有一定的迷惑性,其实仔细想想会发现,最终步数的奇偶性只与最终停留的点有关。
为什么会这样?首先需要证明,从原点触发到某个点(x,y),无论路线如何,步数的奇偶性总是和|x|+|y|相同。
证明:到达(x,y)点是,无论如何移动,x轴移动的步数必然是2*kx+|x|, y轴移动的步数必然是2*ky+|y|,所以总移动步数为2*(kx+ky)+|x|+|y|,奇偶性与|x|+|y|相同。
根据该规律,我们只需要决定最后停留在那个点上就可以确定移动步数的奇偶性。因此遍历各个点的|x|+|y|值,只要存在一个奇偶性与wantedParity相同,答案就是肯定。
Java代码:
public class EvenRoute
{
public String isItPossible(int[] x, int[] y, int wantedParity)
{
for(int i = 0; i < x.length; ++i){
if((Math.abs(x[i]) + Math.abs(y[i])) % 2 == wantedParity % 2){
return "CAN";
}
}
return "CANNOT";
}
}