1. 程式人生 > >第六屆藍橋杯省賽Java語言C組_移動距離

第六屆藍橋杯省賽Java語言C組_移動距離


移動距離

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

資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms


請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。

原始碼如下:


import java.util.Scanner;

public class 移動距離 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		while (input.hasNext()) {
			int w = input.nextInt();
			int m = input.nextInt();
			int n = input.nextInt();
			//求出該樓層的樓號是正序還是逆序,注意1/6=0,而6/6=1,所以需要將樓號減一
			int x1 = (m - 1) / w;
			int x2 = (n - 1) / w;
			int count = Math.abs(x1 - x2);//樓層間隔
			//求出該樓號在這層樓的第幾個位置,如果樓號為逆序,那麼就需要轉換一下
			int d1 = m % w;
			int d2 = n % w;
			int dis = 0;
			if (x1 % 2 == 0 && x2 % 2 == 0 || x1 % 2 != 0 && x2 % 2 != 0) {
				//在同一豎線上
				if (d1 == d2) {
					dis = count;
				}
			} else {
				//			將倒著數的那一行調整過來
				if (x1 % 2 != 0) {
					d1 = w - d1 + 1;
					if (d1 == 7) {
						d1 = 1;
					}
				} else if (x2 % 2 != 0) {
					d2 = w - d2 + 1;
					if (d2 == 7) {
						d2 = 1;
					}
				}

			}
			dis = Math.abs(d1 - d2) + count;//最短距離就等於兩個樓號相減再加上樓層間隔
			System.out.println(dis);
		}

	}

}