X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...

简介: X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...

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

*/

方法一:(思维简单,但比较麻烦,执行速度慢)

package 蓝桥;
import java.util.Scanner;
public class lou {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int tamp=scanner.nextInt();
    int n,m,sum=0;
    n=scanner.nextInt();
    m=scanner.nextInt();
    int[][] a=new int[10000/tamp+10][tamp];
    int x=-1,y=0,o=1;
    for (int i = 1; i <= 10000; i++) {
      x+=o;
      //System.out.println(y+"   "+x);
      a[y][x]=i;
      if((x==0||x==tamp-1)&&i!=1)
      {
        o=-o;
        y++;
        i++;
        //System.out.println(y+"   "+x);
        a[y][x]=i;
      }
    }
    x=y=-99;
    int x2=-99,y2=-99;
    for (int i = 0; i < ((10000/tamp)+1); i++) {
      for (int j = 0; j <tamp ; j++) {
        if (a[i][j]==n) {
          x=i;
          y=j;
          break;
        }
      }
      if (x!=-99&&y!=-99) {
        break;
      }
    }
    for (int i = 0; i < ((10000/tamp)+1); i++) {
      for (int j = 0; j <tamp ; j++) {
        if (a[i][j]==m) {
          x2=i;
          y2=j;
          break;
        }
      }
      if (x2!=-99&&y2!=-99) {
        break;
      }
    }
    sum=Math.abs(x-x2)+Math.abs(y-y2);
    System.out.println(sum);
  }
}

方法二:(找规律,速度快)

package 蓝桥;
import java.util.Scanner;
public class lou {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int tamp=scanner.nextInt();
    int n,m,sum=0;
    n=scanner.nextInt();
    m=scanner.nextInt();
    sum+=Math.abs((n+tamp-1)/tamp-(m+tamp-1)/tamp);
    int x=(n%tamp);
    int y=(m%tamp);
    if (((n+tamp-1)/tamp)%2==0&&x!=0) {
      x=tamp-x+1;
    }
    else if (x==0) {
      x=1;
    }
    if (((m+tamp-1)/tamp)%2==0&&y!=0) {
      y=tamp-y+1;
    }
    else if (y==0) {
      y=1;
    }
    sum+=Math.abs(x-y);
    System.out.println(sum);
  }
}

           


相关文章
|
2月前
|
数据可视化 数据挖掘 数据处理
Python实现数字按三角形排列
Python实现数字按三角形排列
27 4
|
6月前
|
算法
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
62 1
|
7月前
## 标题: 求一元二次方程的根(25分)
## 标题: 求一元二次方程的根(25分)
|
人工智能 BI
牛客 序列排列1
牛客 序列排列1
68 0
|
人工智能 算法
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
66 0
学C的第二十四天【练习:1. 打印菱形;2. 打印自幂数;3. 求Sn=a+aa..n项之和;4. 喝汽水问题;5. 调整数组使奇数位于偶数前面;6. 打印X形图案;7……;8……;9……;10……】-2
5. 调整数组使奇数全部都位于偶数前面 题目: 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。
130 0
剑指offer 70. 圆圈中最后剩下的数字
剑指offer 70. 圆圈中最后剩下的数字
71 0
Leecode 面试题62. 圆圈中最后剩下的数字
Leecode 面试题62. 圆圈中最后剩下的数字
70 0
|
索引
每日三题-下一个排列、颜色分类、寻找重复数
每日三题-下一个排列、颜色分类、寻找重复数
83 0
每日三题-下一个排列、颜色分类、寻找重复数