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;

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