藍橋杯 移動距離 -----------Five-菜鳥級
阿新 • • 發佈:2018-12-24
移動距離
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;
}