1. 程式人生 > >2019年藍橋杯練習3-樓號m和n之間的最短移動距離

2019年藍橋杯練習3-樓號m和n之間的最短移動距離

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;	
}

分析: 

 可以不用想得太複雜,直接找規律,重點是找到計算行號和列號的規律,多驗證幾組邊緣的資料來確定規律是否正確。