程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

藍橋杯

編輯:編程解疑
藍橋杯—移動距離的問題,走過的路過,千萬不要錯過

移動距離

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

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

我找到的解答方案如下:

 #include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int w,m,n;
    cin>>w>>m>>n;

    m--;
    n--;

    int m1=m/w, m2=m%w;
    if(m1&1)
    {
        m2=w-1-m2;
    }

    int n1=n/w, n2=n%w;
    if(n1&1)
    {
        n2=w-1-n2;
    }       

    cout<<abs(m1-n1)+abs(m2-n2)<<endl;
    return 0;
}

圖片說明

最佳回答:


m1&1和n1&1是判斷奇數偶數的,

最後輸出abs(m1-n1)這個沒問題吧?就是兩個樓差的行數,比如7和20,這部分就是3
abs(m2-n2)的部分就是判斷兩樓在同一行時需要走的路。如果m1或者n1是奇數,w-1-m1表示樓離最左邊的距離。也就是最後求兩個樓離最左邊距離的差的絕對值

最初的時候m--和n--,表示把整個矩陣改變為從0開始。

比如4 7 20

矩陣:
0 1 2 3
7 6 5 4
8 9 10 11
15 14 13 12
16 17 18 19
20
這樣就是求6和19的距離了

其實如果不做m--和n--改變下算法也是可以的

rl529014
rl529014
u013596119
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved