第六届蓝桥杯移动距离


题目

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

答案

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int w = sc.nextInt();
        int m = sc.nextInt();
        int n = sc.nextInt();
        int row = 10000 % w == 0 ? 10000 / w : (10000 / w) + 1;
        row = row % 2 == 0 ? row : row + 1;
        //由于我的生成数组的方式是两行两行生成,在总行数为单数的请况下可能出现错误,这里没有改进,而是选择了多生成一行来解决
        //可以使用一个布尔值来控制数组是正向还是反向,生成完一行后使该布尔值取非即可
        //没有必要让数组生成到10000,可以根据m和n中大的那个值来判断应该生成到多少

        int[][] nums = new int[row][w];
        //初始化
        int a = 1;


        for (int i = 0; i < nums.length - 1; i += 2) {
            //单数
            for (int j = 0; j < nums[i].length; j++) {
                nums[i][j] = a++;
            }
            //双数,反向遍历
            for (int k = w - 1; k >= 0; k--) {
                nums[i + 1][k] = a++;
            }

        }

        for (int i = 0; i < nums.length; i++) {
            System.out.println(Arrays.toString(nums[i]));
        }

        //将m和n的坐标获取出来
        int[] w_m = new int[2];
        int[] w_n = new int[2];
        boolean flag_1 = false;
        boolean flag_2 = false;

        l:
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums[i].length; j++) {
                //两个值都找到即退出
                if (flag_1 && flag_2) {
                    break l;
                }
                if (nums[i][j] == m) {
                    flag_1 = true;
                    w_m[0] = i;
                    w_m[1] = j;
                }
                if (nums[i][j] == n) {
                    flag_2 = true;
                    w_n[0] = i;
                    w_n[1] = j;
                }
            }
        }

        //横坐标差的绝对值加上纵坐标差的绝对值即为答案
        int result = (Math.abs(w_m[0] - w_n[0])) + (Math.abs(w_m[1] - w_n[1]));
        System.out.println(result);

    }

文章作者: WJF
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WJF !
  目录