2015藍橋杯c/c++|B組08(移動距離)

移動距離

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 , 不能通過工程設置而省略常用頭文件。

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

解題思路:
先不看樓號只看m到n的最近路線,就是 m和n的行差與列差之和。現在只要找到m與n的行號與列號就能解決問題。
分析樓號的排列規律,可以分成奇數行和偶數行,奇數行的數依次遞增,偶數行的數依次遞減,觀察奇數行每一行的數與第一行相應位置的數之間的關係,發現第n行的數與第一行的數之差2w的整數倍,同樣,偶數行第n行的數與第二行的數之差也爲2w。所以將第一行與第二行錄入arr1和arr2兩個數組,利用上述關係,就很容易確定行列了。
代碼很簡單,注意扣好邊界。

c/c++代碼

#include<iostream>
#include <cmath>
using namespace std;

int main() {
    int w, m, n;
    cin >> w >> m >> n;
    int arr1[w];
    int arr2[w];
    int i;
    for (i = 0; i < w; i++)
        arr1[i] = i + 1;
    int tmp=w;
    for(i=w-1;i>=0;i--){
        arr2[i]=++tmp;
    }
    int r_m, r_n, c_m, c_n;
    for (i = 0; i < w; i++) {
        if ((m - arr1[i]) % (2*w) == 0) {
            r_m = (m - arr1[i]) /(2*w) * 2 + 1;
            c_m = i;
        }
        if ((m - arr2[i]) % (2*w) == 0) {
            r_m = (m - arr2[i]) / (2*w) * 2 + 2;
            c_m = i;
        }
        if ((n - arr1[i]) % (2*w)== 0) {
            r_n = (n - arr1[i]) / (2*w) * 2 + 1;
            c_n = i;
        }
        if ((n - arr2[i]) % (2*w) == 0) {
            r_n = (n - arr2[i]) / (2*w) * 2 + 2;
            c_n = i;
        }
    }
    int answer=abs(c_n-c_m)+abs(r_m-r_n);
    cout<<answer;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章