2019年藍橋杯練習3-樓號m和n之間的最短移動距離
阿新 • • 發佈:2019-01-05
2019年藍橋杯練習3-樓號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
分析:
/*
找規律知:最短移動距離為兩點橫座標差的絕對值+縱座標差的絕對值。
奇數行:從小到大
偶數行:從大到小
*/
#include<stdio.h> #include<math.h> int row(int w,int i) { //計算點的行號 int irow; //下列計算取第一行的行號為1,而不是0 if(i%w==0) //值是寬度的倍數 irow=i/w; else //值不是寬度的倍數 irow=i/w+1; return irow; } int col(int w,int j) { //計算點的列號 int jcol; //下列計算取第一列的列號為1,而不是0 if(row(w,j)%2==0) { //該值在偶數行 if(j%w==0) // 找規律可知,偶數行能被整除肯定在第一列 jcol=1; else //在偶數行(從大到小)但不能被整除,在倒數第j%w列,即正數第w-j%w+1列 jcol=w-j%w+1; } else { //在奇數行 if(j%w==0) //找規律可知,偶數行能被整除肯定在最後一列 jcol=w; else //在奇數行(從小到大)但不能被整除,在第j%w列 jcol=j%w; } return jcol; } int main() { int w,m,n; while(scanf("%d %d %d",&w,&m,&n)==3) { int s=fabs(row(w,n)-row(w,m))+fabs(col(w,n)-col(w,m)); printf("%d\n",s); } return 0; }
分析:
可以不用想得太複雜,直接找規律,重點是找到計算行號和列號的規律,多驗證幾組邊緣的資料來確定規律是否正確。