1. 程式人生 > >2015年第六屆藍橋杯C/C++程式設計本科B組省賽 移動距離(程式設計大題)

2015年第六屆藍橋杯C/C++程式設計本科B組省賽 移動距離(程式設計大題)

2015年第六屆藍橋杯C/C++程式設計本科B組省賽題目彙總:


移動距離
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消耗 < 1ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include<xxx>, 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。

思路:對每個數字的所在行的行座標進行奇偶性判斷,得出列座標,最後用兩點座標差求距離。

#include <iostream>
#include <cmath>
using namespace std;
void f(int w,int n,int &x,int &y)
{
    x=(n-1)/w;
    y=(n-1)%w;

    if(x%2!=0)
        y=w-1-y;
}
int main()
{
    int w,m,n,x1,y1,x2,y2;
    cin>>w>>m>>n;
    f(w,m,x1,y1);
    f(w,n,x2,y2);
    cout<<abs(x1-x2)+abs(y1-y2)<<endl;
    return 0;
}