计算m-n楼的最短距离

[问题描述]


 X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:
 1  2  3  4  5  6

 12 11 10 9  8  7

 13 14 15 .....

 我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)
 输入为3个整数w m n,空格分开,都在1到10000范围内
 要求输出一个整数,表示m n 两楼间最短移动距离。

 [样例输入]      [样例输出]

 6 8 2               4

 4 7 20             5

 [我的答案]

public class MyAnswer {
	public static void main(String[] args) {
		int w;
		int m;
		int n;
		int m_hang=0;
		int m_lie;
		int n_hang=0;
		int n_lie;
		Scanner sc=new Scanner(System.in);
		w=sc.nextInt();m=sc.nextInt();n=sc.nextInt();
		
		//m小,n大
		if(m>n) {
			int x=m;
			m=n;
			n=x;
		}
		
		//判断m在第几行
		int i=1;
		Boolean b=true;
		while(b) {
			if(w*i>=m) {
				m_hang=i;
				b=false;
			}else {
				i++;
			}
		}
		if(m_hang%2==0) {
			if(m%w!=0)
				m_lie=w-(m%w)+1;
				else
					m_lie=1;
			
		}else {
			m_lie=m%w;
			if(m_lie==0) {
				m_lie=w;
			}
		}
		
		System.out.println(m_hang+" "+m_lie+" ");
		
		//判断n第几行
		b=true;
		while(b) {
			if(w*i>=n) {
				n_hang=i;
				b=false;
			}else {
				i++;
			}
		}
		
		if(n_hang%2==0) {
			if(n%w!=0)
			n_lie=w-(n%w)+1;
			else
				n_lie=1;
		}else {
			n_lie=n%w;
			if(n_lie==0) {
				n_lie=w;
			}
		}
		System.out.println(n_hang+" "+n_lie+" ");
		
		int distance_hang=n_hang-m_hang;
		int distance_lie=n_lie-m_lie;
		if(distance_lie<0) {
			distance_lie=-distance_lie;
		}
		System.out.println(distance_hang+" "+distance_lie+" ");
		System.out.println(distance_hang+distance_lie);

	}

}

本题的思路很清晰,只要把距离分成行距离和列距离即可。但是在做的时候,需要注意很多:

1.在判断行的时候,第一行的条件必须考虑。本人一开始的判断语句,直接跳过了第一行。

2.在判断列的时候,需要注意,取余为0的情况要单独列出来。同时在两列相减的时候,需要+1。

 [更好答案]

import java.util.Scanner;

public class Answer {

		  public static void main(String[] args) {

		    Scanner sc = new Scanner(System.in);
		    int w = sc.nextInt();
		    int m = sc.nextInt();
		    int n = sc.nextInt();
		    
		    int bigger = Integer.max(m, n);
		    int smaller = Integer.min(m, n);
		    int r1 = bigger % w == 0 ? (bigger / w - 1) : bigger / w;//大数的行号
		    
		    int c1;//计算列号
		    if ((r1 & 1) == 1) {//第偶数行,顺着走
		      c1 = (w - bigger % w) % w;
		    } else {//奇数行
		      c1 = (bigger % w - 1 + w) % w;
		    }

		    int r2 = smaller % w == 0 ? (smaller / w - 1) : smaller / w;//小数的行号
		    int c2;
		    if ((r2 & 1) == 1) {//第偶数行,顺着走
		      c2 = (w - smaller % w) % w;
		    } else {//奇数行
		      c2 = (smaller % w - 1 + w) % w;
		    }
		    System.out.println(Math.abs(r1 - r2) + Math.abs(c1 - c2));
		  }

}

别人的答案里面,写的比我的简洁,思路是一样的。优化点有一下三点:

1.在判断行的时候,他直接用了三元运算,很简洁。

2.比较m和n的大小时,直接使用了函数max和min。

3.最终取绝对值,他用了abs函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值