杭电ACM 1030 Delta-wave java代码解析

Delta-wave

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6931    Accepted Submission(s): 2674


Problem Description
A triangle field is numbered with successive integers in the way shown on the picture below. 



The traveller needs to go from the cell with number M to the cell with number N. The traveller is able to enter the cell through cell edges only, he can not travel from cell to cell through vertices. The number of edges the traveller passes makes the length of the traveller's route. 

Write the program to determine the length of the shortest route connecting cells with numbers N and M. 
 

Input
Input contains two integer numbers M and N in the range from 1 to 1000000000 separated with space(s).
 

Output
Output should contain the length of the shortest route.
 

Sample Input
   
   
   
   
6 12
 

Sample Output
   
   
   
   
3
 
求最近的路径的大小,本质上这个题中每一个块可以表示为三个坐标的形式,那就是水平方向的第几层,左侧的左侧第几列,右侧看右侧第几列,比如说:1这个元素在水平第1层,左侧第1列,右侧第1列; 6这个元素是水平第3层,左侧第2层,右侧第1层,那么1到6的计算就是这三个坐标的差的绝对值之和:2+1+0 = 3 ,也就是说1到6需要3步。
剩下的自然是怎么求出来各个方向上的位置咯:水平方向是level = sqrt(num - 1) + 1,左侧的坐标可以表示为:left = ( level*level - num)/ 2 +1, 
右侧的坐标可以表示为:right = (num- (level-1)*(level-1) - 1)/ 2 + 1
那么剩下的就是将两个点的三个坐标的值对应求差然后去绝对值再求和就可以了。
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext())
		{
			int num1 = scanner.nextInt();
			int num2 = scanner.nextInt();
			
			int level1 = (int)Math.sqrt(num1 - 1) + 1;
			
			int left4num1 = (level1*level1 - num1)/2 + 1;
			int right4num1 = (num1 - (level1 - 1) * (level1 - 1) - 1)/2 + 1;
			
			int level2 = (int)Math.sqrt(num2 - 1) + 1;
			
			int left4num2 = (level2*level2 - num2)/2 + 1;
			int right4num2 = (num2 - (level2 - 1) * (level2 - 1) - 1)/2 + 1;
			
			System.out.println(Math.abs(level1 - level2) + Math.abs(left4num1 - left4num2) + Math.abs(right4num1 - right4num2));
			
		}
	}

}



你可能感兴趣的:(ACM)