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);
  }
}

           


相关文章
|
10月前
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
33 0
|
2月前
|
算法
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
16 1
剑指offer 70. 圆圈中最后剩下的数字
剑指offer 70. 圆圈中最后剩下的数字
47 0
Leecode 面试题62. 圆圈中最后剩下的数字
Leecode 面试题62. 圆圈中最后剩下的数字
57 0
Leecode 914.卡牌分组
Leecode 914.卡牌分组
67 0
|
索引
力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次
力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次
力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次
|
算法
算法练习题(六)——Z字型打印矩阵
算法练习题(六)——Z字型打印矩阵
94 0
|
索引
每日三题-下一个排列、颜色分类、寻找重复数
每日三题-下一个排列、颜色分类、寻找重复数
69 0
每日三题-下一个排列、颜色分类、寻找重复数
|
前端开发
伪类选择器设置奇偶数标签(1+X Web前端开发 例题)
伪类用于定义元素的特殊状态。 例如,它可以用于:设置鼠标悬停在元素上时的样式,为已访问和未访问链接设置不同的样式,设置元素获得焦点时的样式
220 0
伪类选择器设置奇偶数标签(1+X Web前端开发 例题)