1. 程式人生 > >藍橋杯 移動距離 -----------Five-菜鳥級

藍橋杯 移動距離 -----------Five-菜鳥級

                                                  移動距離

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範圍內
w為排號寬度,m,n為待計算的樓號。
要求輸出一個整數,表示m n 兩樓間最短移動距離。

例如:
使用者輸入:
6 8 2
則,程式應該輸出:
4

再例如:
使用者輸入:
4 7 20
則,程式應該輸出:
5

資源約定:
峰值記憶體消耗 < 256M
CPU消耗  < 1000ms


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

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include <xxx>, 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

 

思路: 這題找找規律就好了  看看序列加上 座標後變成什麼了

         目標  2 的座標 (0 ,1) 目標  8 的座標 (1 ,4)  他們的橫縱座標 相減 (1-0,4-1)===> (1,3)

         再 橫縱座標相加 1+3=4   (想想 此時就是從(0,0)點 到(1,3)點 不能斜著走最最短 直接橫縱座標相加即可)

 

      於是就得獲取兩點座標 ,座標直接通過取整取模就可獲得 (畢竟 他是按順序編號的)

    把原序列 全部減1 從0 開始(為了好取模取整  C語言習慣0 開始) 然後找座標  ,通過取整可以得到屬於哪一行 取模得到那一列

   (但為偶數行的時候 去模後的值就是距離最左邊距離,奇數行時 取模後的值是距離右邊的距離 所以 要用最每行長度-取模的值)

     

#include<stdio.h>
int abs(int a){// 取絕對值 
	if(a>0)return a;
	else return -a;
}
int main(){
    int w,A,B,x1,x2,y1,y2,res;
    while(scanf("%d%d%d",&w,&A,&B)!=EOF){
      A--,B--;//數值都-1 是將序號從 0 開始 好用取整 取模  
	  x1=A/w;// 對A 點取整 可以確定在那一行 
	  if(x1%2==0) y1=A%w;// A點取模 (取餘) 可以確定在那一列 
	  else y1=(w-1)-A%w;
	  //因為翻轉的緣故 所以 當 為 奇數行的時候是從右邊開始 那麼到左邊的距離就該 
	  //用每行長度減去該數到右邊的值  因為下標是從0 開始 
	  //所以 長度 w-1 (數值為5 就代表 長度6 ) 
	  //B 點座標 同上 
	  x2=B/w;
	  if(x2%2==0) y2=B%w;
	  else y2=(w-1)-B%w;
      res=abs(x1-x2)+abs(y1-y2);// 兩座標 橫縱座標 相減 即是 最短距離 
     printf("%d\n",res);
  }
	return 0;
}