杭电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));
			
		}
	}

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值